前言
继续来~~~~~~~~~~~~~~~~~~~~~~
图放好~~~~~~~~~~~~~~~~~~~~~~
这一节已经完成了代码,因此我们来构造测试用例。
测试指令
我在用例中写的简单的几条指令时这样的:
1. initial begin 2. wait(rst_n == 1'b1); 3. U_RISC_SPM.U_PROCESSING.U_R0.data_out = 8'h3; 4. U_RISC_SPM.U_PROCESSING.U_R1.data_out = 8'h4; 5. U_RISC_SPM.U_PROCESSING.U_R2.data_out = 8'h5; 6. U_RISC_SPM.U_PROCESSING.U_R3.data_out = 8'h6; 7. U_RISC_SPM.U_MEM.mem[0] = {RD, SEL_R1, SEL_R1}; 8. U_RISC_SPM.U_MEM.mem[1] = 129; 9. U_RISC_SPM.U_MEM.mem[2] = {RD, SEL_R2, SEL_R2}; 10. U_RISC_SPM.U_MEM.mem[3] = 130; 11. U_RISC_SPM.U_MEM.mem[4] = {BR, SEL_R2, SEL_R2}; 12. U_RISC_SPM.U_MEM.mem[5] = 10; 13. U_RISC_SPM.U_MEM.mem[129] = 100; 14. U_RISC_SPM.U_MEM.mem[130] = 150; 15. U_RISC_SPM.U_MEM.mem[10] = 28; 16. U_RISC_SPM.U_MEM.mem[28] = {SUB, SEL_R1, SEL_R2}; 17. end
复位时候先把R0/1/2/3给好初值,之后给mem内预置好指令:
mem[0] + mem[1]的指令是一条长指令,把mem[129]的值读出传递给dst = R1寄存器,这条指令执行完R1内的值应该是100;
mem[2] + mem[3]的指令是一条长指令,把mem[130]的值读出传递给dst = R2寄存器,这条指令执行完R2内的值应该是150;
mem[4] + mem[5]的指令同样是是一条长指令,跳转执行mem[10]为索引指向的地址内存储的指令,mem[10]内存储的是28,因此PC下一步应该跳转到28;
mem[28]内存储的是一条短指令,R2 = R2 - R1,执行之后R2内的值应该为50;
所有指令结束。
test完整代码
1. `timescale 1ns/1ps 2. module test(); 3. 4. parameter NOP = 4'b0000; 5. parameter ADD = 4'b0001; 6. parameter SUB = 4'b0010; 7. parameter AND = 4'b0011; 8. parameter NOT = 4'b0100; 9. parameter RD = 4'b0101; 10. parameter WR = 4'b0110; 11. parameter BR = 4'b0111; 12. parameter BRZ = 4'b0111; 13. 14. parameter SEL_R0 = 2'd0; 15. parameter SEL_R1 = 2'd1; 16. parameter SEL_R2 = 2'd2; 17. parameter SEL_R3 = 2'd3; 18. 19. 20. 21. logic clk, rst_n; 22. 23. initial begin 24. clk = 1'b0; 25. forever #5ns clk = ~clk; 26. end 27. 28. initial begin 29. $timeformat(-9, 3," ns ", 5); 30. rst_n = 1'bx; 31. #18ns rst_n = 1'b0; 32. #18ns rst_n = 1'b1; 33. end 34. 35. initial begin 36. foreach(U_RISC_SPM.U_MEM.mem[i])begin 37. U_RISC_SPM.U_MEM.mem[i] = '0; 38. end 39. end 40. 41. initial begin 42. wait(rst_n == 1'b1); 43. U_RISC_SPM.U_PROCESSING.U_R0.data_out = 8'h3; 44. U_RISC_SPM.U_PROCESSING.U_R1.data_out = 8'h4; 45. U_RISC_SPM.U_PROCESSING.U_R2.data_out = 8'h5; 46. U_RISC_SPM.U_PROCESSING.U_R3.data_out = 8'h6; 47. U_RISC_SPM.U_MEM.mem[0] = {RD, SEL_R1, SEL_R1}; 48. U_RISC_SPM.U_MEM.mem[1] = 129; 49. U_RISC_SPM.U_MEM.mem[2] = {RD, SEL_R2, SEL_R2}; 50. U_RISC_SPM.U_MEM.mem[3] = 130; 51. U_RISC_SPM.U_MEM.mem[4] = {BR, SEL_R2, SEL_R2}; 52. U_RISC_SPM.U_MEM.mem[5] = 10; 53. U_RISC_SPM.U_MEM.mem[129] = 100; 54. U_RISC_SPM.U_MEM.mem[130] = 150; 55. U_RISC_SPM.U_MEM.mem[10] = 28; 56. U_RISC_SPM.U_MEM.mem[28] = {SUB, SEL_R1, SEL_R2}; 57. end 58. 59. RISC_SPM U_RISC_SPM(clk, rst_n); 60. 61. endmodule
测试结果
可以观察到R1和R2的跳转是符合我们的预期的!!!!