memory.sv 797 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. module memory(clk, we, a, wd, rd);
  2. parameter WIDTH=8, LENGTH=256;
  3. localparam ADDR_WIDTH = $clog2(LENGTH);
  4. input clk, we;
  5. input [WIDTH-1:0] wd;
  6. input [ADDR_WIDTH-1:0] a;
  7. output [WIDTH-1:0] rd;
  8. logic [WIDTH-1:0]memory[LENGTH-1:0];
  9. assign rd = memory[a];
  10. always_ff@(posedge clk) if(we) memory[a] <= wd;
  11. endmodule
  12. module memory_tb;
  13. logic clk, wr_en;
  14. word addr, wr_data, rd_data;
  15. memory MEM(clk, wr_en, addr, wr_data, rd_data);
  16. localparam csize = 10;
  17. initial begin
  18. clk = 0;
  19. forever #5ns clk = ~clk;
  20. end
  21. initial begin
  22. addr = 0;
  23. wr_en = 1;
  24. for(int i=0;i<csize;i++) begin
  25. wr_data = i;
  26. addr = i;
  27. #10ns;
  28. end
  29. wr_en = 0;
  30. wr_data = 0;
  31. for(int i=0;i<csize;i++) begin
  32. #10ns;
  33. addr = i;
  34. assert(rd_data == i);
  35. end
  36. $stop;
  37. end
  38. endmodule