diff options
| -rw-r--r-- | my_mem.tb.v | 111 | ||||
| -rw-r--r-- | my_mem.v | 31 |
2 files changed, 142 insertions, 0 deletions
diff --git a/my_mem.tb.v b/my_mem.tb.v new file mode 100644 index 0000000..63eaba4 --- /dev/null +++ b/my_mem.tb.v @@ -0,0 +1,111 @@ +// LLM generated, because I'm too lazy to do this manually + +`timescale 1us/1ns + +module my_mem_tb(); + + localparam DATA_WIDTH = 8; + localparam DATA_DEPTH = 16; + localparam ADDR_WIDTH = $clog2(DATA_DEPTH); + + // DUT signals + logic clk; + logic write_en_i; + logic read_en_i; + logic [ADDR_WIDTH-1:0] r_read_addr; + logic [ADDR_WIDTH-1:0] r_write_addr; + logic [DATA_WIDTH-1:0] data_i; + logic [DATA_WIDTH-1:0] data_o; + + // Instantiate DUT + my_mem #( + .DATA_WIDTH(DATA_WIDTH), + .DATA_DEPTH(DATA_DEPTH) + ) dut ( + .clk_i(clk), + .write_en_i(write_en_i), + .read_en_i(read_en_i), + .r_read_addr(r_read_addr), + .r_write_addr(r_write_addr), + .data_i(data_i), + .data_o(data_o) + ); + + string filename; + initial begin + `ifdef DUMP_FILE_NAME + filename=`DUMP_FILE_NAME; + `else + filename="my_mem.lxt2"; + `endif + $dumpfile(filename); $dumpvars(); + end + + // Clock generator + always #10 clk = ~clk; + + // Test sequence + initial begin + clk = 0; + write_en_i = 0; + read_en_i = 0; + r_read_addr = '0; + r_write_addr = '0; + data_i = '0; + + repeat (3) @(posedge clk); + + // ------------------------- + // Write some values + // ------------------------- + @(posedge clk); + #1 + write_en_i = 1; + r_write_addr = 10; + data_i = 8'hA5; + + @(posedge clk); + #1 + r_write_addr = 11; + data_i = 8'h3C; + + @(posedge clk); + #1 + write_en_i = 0; + + // ------------------------- + // Read back values + // ------------------------- + + // asserts fail in iverilog if I use the posedge stuff, + // (but works in verilator). + // need an additional clock cycle delay. + + @(posedge clk); + #1 + read_en_i = 1; + r_read_addr = 10; + + @(posedge clk); + #1 + assert (data_o == 8'hA5) + else $error("ASSERTION FAILED: addr 10 expected 0xA5, got 0x%02h", data_o); + + @(posedge clk); + #1 + r_read_addr = 11; + + @(posedge clk); + #1 + assert (data_o == 8'h3C) + else $error("ASSERTION FAILED: addr 11 expected 0x3C, got 0x%02h", data_o); + + @(posedge clk); + #1 + read_en_i = 0; + + repeat (3) @(posedge clk); + $finish; + end + +endmodule diff --git a/my_mem.v b/my_mem.v new file mode 100644 index 0000000..e4ed4f6 --- /dev/null +++ b/my_mem.v @@ -0,0 +1,31 @@ +`timescale 1us/1us + +module my_mem #( + parameter DATA_WIDTH = 8, + parameter DATA_DEPTH = 1024 +) ( + input clk_i, + + input write_en_i, + input read_en_i, + + input [$clog2(DATA_DEPTH)-1:0] r_read_addr, + input [$clog2(DATA_DEPTH)-1:0] r_write_addr, + + input [(DATA_WIDTH-1) : 0] data_i, + output reg [(DATA_WIDTH-1) : 0] data_o +); + +reg [(DATA_WIDTH-1) : 0] r_datastore [(DATA_DEPTH-1) : 0]; + +always @(posedge clk_i) begin + if (write_en_i) begin + r_datastore[r_write_addr] <= data_i; + end + + if (read_en_i) begin + data_o <= r_datastore[r_read_addr]; + end +end + +endmodule |
