`timescale 1ns/1ps module core_tb(); initial $timeformat(-9, 2, " ns", 20); initial begin $dumpfile("core_tb.vcd"); $dumpvars(0); end wire dummy_out; localparam MEM_INST_LENGTH = 256; // words localparam MEM_DATA_LENGTH = 256; // words localparam MEM_DATA_BASE = 32'h00100000; localparam INST_NOP = 32'h00000013; // nop localparam DATA_DEFAULT = 32'h00000000; localparam DATA_INVALID = 32'hdeadbeef; reg clk, reset; // Instruction memory reg [31:0] mem_inst [0:MEM_INST_LENGTH-1]; wire [31:0] mem_inst_addr; wire [31:0] mem_inst_idx = mem_inst_addr >> 2; wire [31:0] mem_inst_data = mem_inst_idx < MEM_INST_LENGTH ? mem_inst[mem_inst_idx] : INST_NOP; initial begin: mem_inst_init integer i; for (i=0; i> 2; always @(*) begin if (mem_data_idx < MEM_DATA_LENGTH) begin mem_data_rdata = mem_data[mem_data_idx]; end else begin mem_data_rdata = DATA_INVALID; end end always @(posedge clk) begin if (mem_data_idx < MEM_DATA_LENGTH) begin if (mem_data_we) begin if (mem_data_wmask[0]) begin mem_data[mem_data_idx][7:0] <= mem_data_wdata[7:0]; end if (mem_data_wmask[1]) begin mem_data[mem_data_idx][15:8] <= mem_data_wdata[15:8]; end if (mem_data_wmask[2]) begin mem_data[mem_data_idx][23:16] <= mem_data_wdata[23:16]; end if (mem_data_wmask[3]) begin mem_data[mem_data_idx][31:24] <= mem_data_wdata[31:24]; end end end else begin // ignore illegal writes end end endmodule