70 lines
1.5 KiB
Coq
70 lines
1.5 KiB
Coq
|
|
||
|
module tcm_mem_ram
|
||
|
(
|
||
|
// Inputs
|
||
|
input clk0_i
|
||
|
,input rst0_i
|
||
|
,input [ 13:0] addr0_i
|
||
|
,input [ 31:0] data0_i
|
||
|
,input [ 3:0] wr0_i
|
||
|
,input clk1_i
|
||
|
,input rst1_i
|
||
|
,input [ 13:0] addr1_i
|
||
|
,input [ 31:0] data1_i
|
||
|
,input [ 3:0] wr1_i
|
||
|
|
||
|
// Outputs
|
||
|
,output [ 31:0] data0_o
|
||
|
,output [ 31:0] data1_o
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------
|
||
|
// Dual Port RAM 64KB
|
||
|
// Mode: Read First
|
||
|
//-----------------------------------------------------------------
|
||
|
/* verilator lint_off MULTIDRIVEN */
|
||
|
reg [31:0] ram [16383:0] /*verilator public*/;
|
||
|
/* verilator lint_on MULTIDRIVEN */
|
||
|
|
||
|
reg [31:0] ram_read0_q;
|
||
|
reg [31:0] ram_read1_q;
|
||
|
|
||
|
|
||
|
// Synchronous write
|
||
|
always @ (posedge clk0_i)
|
||
|
begin
|
||
|
if (wr0_i[0])
|
||
|
ram[addr0_i][7:0] <= data0_i[7:0];
|
||
|
if (wr0_i[1])
|
||
|
ram[addr0_i][15:8] <= data0_i[15:8];
|
||
|
if (wr0_i[2])
|
||
|
ram[addr0_i][23:16] <= data0_i[23:16];
|
||
|
if (wr0_i[3])
|
||
|
ram[addr0_i][31:24] <= data0_i[31:24];
|
||
|
|
||
|
ram_read0_q <= ram[addr0_i];
|
||
|
end
|
||
|
|
||
|
always @ (posedge clk1_i)
|
||
|
begin
|
||
|
if (wr1_i[0])
|
||
|
ram[addr1_i][7:0] <= data1_i[7:0];
|
||
|
if (wr1_i[1])
|
||
|
ram[addr1_i][15:8] <= data1_i[15:8];
|
||
|
if (wr1_i[2])
|
||
|
ram[addr1_i][23:16] <= data1_i[23:16];
|
||
|
if (wr1_i[3])
|
||
|
ram[addr1_i][31:24] <= data1_i[31:24];
|
||
|
|
||
|
ram_read1_q <= ram[addr1_i];
|
||
|
end
|
||
|
|
||
|
assign data0_o = ram_read0_q;
|
||
|
assign data1_o = ram_read1_q;
|
||
|
|
||
|
|
||
|
|
||
|
endmodule
|