reg_file.sv 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import project_pkg::*;
  2. module reg_file(clk, rst, rd_addr1, rd_addr2, rd_data1, rd_data2, wr_addr, wr_data, wr_en);
  3. input logic clk, rst, wr_en;
  4. input e_reg rd_addr1, rd_addr2, wr_addr;
  5. input word wr_data;
  6. output word rd_data1;
  7. output word rd_data2;
  8. logic [word_size-1:0] registry [reg_size-1:0];
  9. always_ff@(posedge clk) begin
  10. if(rst) for(int i=0;i<reg_size;i++) registry[i] <= '0;
  11. else if(wr_en) registry[wr_addr] <= wr_data;
  12. end
  13. assign rd_data1 = registry[rd_addr1];
  14. assign rd_data2 = registry[rd_addr2];
  15. endmodule
  16. module reg_file_tb;
  17. logic clk, rst, wr_en;
  18. logic [1:0]rd_addr1;
  19. logic [1:0]rd_addr2;
  20. logic [1:0]wr_addr;
  21. logic [7:0]rd_data1;
  22. logic [7:0]rd_data2;
  23. logic [7:0]wr_data;
  24. reg_file test_reg_file(clk, rst, rd_addr1, rd_addr2, rd_data1, rd_data2, wr_addr, wr_data, wr_en);
  25. initial begin
  26. clk = 0;
  27. forever #5ns clk = ~clk;
  28. end
  29. initial begin
  30. rd_addr1 = 2'b00;
  31. rd_addr2 = 2'b00;
  32. wr_addr = 0;
  33. rst = 1;
  34. wr_en = 1;
  35. wr_data = 8'hAA;
  36. #10ns
  37. rst=0;
  38. wr_data = 8'hBB;
  39. wr_addr = 1;
  40. #10ns
  41. wr_data = 8'hCC;
  42. wr_addr = 2;
  43. #10ns
  44. wr_data = 8'hDD;
  45. wr_addr = 3;
  46. #10ns
  47. wr_en = 0;
  48. wr_data = 0;
  49. rd_addr1 = 3;
  50. rd_addr2 = 0;
  51. #10ns
  52. assert(rd_data1==8'hDD);
  53. assert(rd_data2==8'hAA);
  54. rd_addr1 = 2;
  55. rd_addr2 = 1;
  56. #10ns
  57. assert(rd_data1==8'hCC);
  58. assert(rd_data2==8'hBB);
  59. $stop;
  60. end
  61. endmodule