# Assignment1: RISC-V Assembly and Instruction Pipeline contributed by < `handsomehsia` > ## make an isoceles triangle :::info Step 1 - Take number of rows to be printed, n. Step 2 - Make an iteration for n times Step 3 - Print " " (space) for in decreasing order from 1 to n-1 Step 4 - Print "* " (start, space) in increasing order Step 5 - Return ::: ### C code ```c= #include <stdio.h> int main() { int i, j, size = 8; for (i = 1; i < size + 1; i++) { // 印出第i列 for (j = 1; j < size + i; j++) { // 每一列有size+i-1個符號 if (j < size - i + 1) { // 在size-i左邊(含)的符號是空白 printf(" "); } else { // 其他的是* printf("*"); } } printf("\n"); } return 0; } ``` #### Result ![](https://i.imgur.com/Vqkf3y8.png) ### Assembly code | info | | |-------|-----| |cycles |1812 | |retired|1186 | |CPI |1.53 | |IPC |0.65| ```cpp= .data length: .word 8 #legs size star: .string "*" spa: .string " " newline: .string "\n" .text #s2 = i #s3 = j #s4 = legs size #t0,t1,t2 = temp size main: add s2, x0, x0 # i =0 add s3, x0, x0 # j = 0 lw s4, length # size = 8 loop1: la a0, newline #print newline li a7, 4 ecall addi s2, s2, 1 #i = i+1 addi t0, s4, 1 #t0 = size+1 blt s2, t0, cond #for(i < size+1) j exit loop2: addi s3, s3, 1 #j = j+1 add t2, s4, s2 #t0=size+i bge s3, t2, loop1 #for(j < size+i ) sub t1, s4, s2 #t1=size-i addi t1, t1, 1 #t1=size-i+1 blt s3, t1, printSpace #if (j < size - i+1) j printStar cond: add s3, x0, x0 # init j j loop2 printStar: la a0, star li a7, 4 ecall j loop2 printSpace: la a0, spa li a7, 4 ecall j loop2 exit: li a7, 10 ecall ``` ## Pipeline Pipeline has 5 stages, IF, ID, EX, MEM and WB. We use pipeline to improve the efficiency of program. #### use `add x18 x0 x0` funtion for example - IF (Instruction Fetch) - Fetch the instruction from the Instruction Memory. - It's depends on the PC (program counter) which is a register can record the address of the instruction being executed at the current time. - PC will be change if some instructions happen like `beq`, `jal`, `j` etc. -ex. pc send pc addr to instruction memory and fetch the instruction addr out 0x00000933 ![](https://i.imgur.com/HSXPxL9.png) - ID (Instruction Decode) - Registers fetch and instruction decode. - It also has some control signals which can decide the register behavior. like write data, clear bit etc. -ex.We fetch 0x0000093 out from instruction memory last time,and now we decode 0x0000093 by its type and there is four part of the result ![](https://i.imgur.com/s9PtJ53.png) ![](https://i.imgur.com/Ll61ELG.png) - EX (Execution) - This stage will execute the instruction according to the opcode. - In branch instruction will check the result is true/false to set the flag and change the PC. - ex.ALU will calculate 0x00000000 + 0x00000000 = 0x00000000 to initialize x18 to zero value. ![](https://i.imgur.com/EHp8KlK.png) ![](https://i.imgur.com/yBG8UYZ.png) - MEM (Mem structure) - Write/Read data with the data memory. - It's decide the address of the memory according to opcode. - It has two signals `MemRead` and `MemWrite` which can distinguish between write and read operation. - ex.Add instruction don’t need to access memory or write data. It just need to pass by the mem stage. ![](https://i.imgur.com/8l4291V.png) - WB (Write Back) - Write ALU output back to the register file. - it has a signal `MemtoReg` which decide whether write data back to the register file. ## Description