sim_tb_top.v
来自「Xilinx DDR2存储器接口调试代码」· Verilog 代码 · 共 373 行 · 第 1/2 页
V
373 行
// for the memory part x16, if the data width is not multiple
// of 16, memory models are instantiated for all data with x16
// memory model and except for MSB data. For the MSB data
// of 8 bits, all memory data, strobe and mask data signals are
// replicated to make it as x16 part. For example if the design
// is generated for data width of 72, memory model x16 parts
// instantiated for 4 times with data ranging from 0 to 63.
// For MSB data ranging from 64 to 71, one x16 memory model
// by replicating the 8-bit data twice and similarly
// the case with data mask and strobe.
for(i = 0; i < `DATA_WIDTH/16 ; i = i+1) begin: u0
ddr2_model u_mem0
(
.ck (ddr2_clk[i]),
.ck_n (ddr2_clk_n[i]),
.cke (ddr2_cke),
.cs_n (ddr2_cs_n),
.ras_n (ddr2_ras_n),
.cas_n (ddr2_cas_n),
.we_n (ddr2_we_n),
.dm_rdqs (ddr2_dm[(2*(i+1))-1 : i*2]),
.ba (ddr2_ba),
.addr (ddr2_address),
.dq (ddr2_dq[(16*(i+1))-1 : i*16]),
.dqs (ddr2_dqs[(2*(i+1))-1 : i*2]),
.dqs_n (ddr2_dqs_n[(2*(i+1))-1 : i*2]),
.rdqs_n (),
.odt (ddr2_odt)
);
end
ddr2_model u_mem1
(
.ck (ddr2_clk[`CLK_WIDTH-1]),
.ck_n (ddr2_clk_n[`CLK_WIDTH-1]),
.cke (ddr2_cke),
.cs_n (ddr2_cs_n),
.ras_n (ddr2_ras_n),
.cas_n (ddr2_cas_n),
.we_n (ddr2_we_n),
.dm_rdqs ({ddr2_dm[`DATA_MASK_WIDTH - 1],
ddr2_dm[`DATA_MASK_WIDTH - 1]}),
.ba (ddr2_ba),
.addr (ddr2_address),
.dq ({ddr2_dq[`DATA_WIDTH - 1 : `DATA_WIDTH - 8],
ddr2_dq[`DATA_WIDTH - 1 : `DATA_WIDTH - 8]}),
.dqs ({ddr2_dqs[`DATA_STROBE_WIDTH - 1],
ddr2_dqs[`DATA_STROBE_WIDTH - 1]}),
.dqs_n ({ddr2_dqs_n[`DATA_STROBE_WIDTH - 1],
ddr2_dqs_n[`DATA_STROBE_WIDTH - 1]}),
.rdqs_n (),
.odt (ddr2_odt)
);
end
else begin
// if the data width is multiple of 16
for(i = 0; i < `DATA_STROBE_WIDTH/2; i = i+1) begin: u1
ddr2_model u_mem0
(
.ck (ddr2_clk[i]),
.ck_n (ddr2_clk_n[i]),
.cke (ddr2_cke),
.cs_n (ddr2_cs_n),
.ras_n (ddr2_ras_n),
.cas_n (ddr2_cas_n),
.we_n (ddr2_we_n),
.dm_rdqs (ddr2_dm[(2*(i+1))-1 : i*2]),
.ba (ddr2_ba),
.addr (ddr2_address),
.dq (ddr2_dq[(16*(i+1))-1 : i*16]),
.dqs (ddr2_dqs[(2*(i+1))-1 : i*2]),
.dqs_n (ddr2_dqs_n[(2*(i+1))-1 : i*2]),
.rdqs_n (),
.odt (ddr2_odt)
);
end
end
end
end else
if (DEVICE_WIDTH == 8) begin
// if the memory part is x8
if ( REG_ENABLE ) begin
// if the memory part is Registered DIMM
for(i = 0; i < `DATA_WIDTH/`DATABITSPERSTROBE; i = i+1) begin: u2
ddr2_model u_mem0
(
.ck (ddr2_clk[`CLK_WIDTH*i/`DATA_STROBE_WIDTH]),
.ck_n (ddr2_clk_n[`CLK_WIDTH*i/`DATA_STROBE_WIDTH]),
.cke (ddr2_cke_reg),
.cs_n (ddr2_cs_n_reg),
.ras_n (ddr2_ras_n_reg),
.cas_n (ddr2_cas_n_reg),
.we_n (ddr2_we_n_reg),
.dm_rdqs (ddr2_dm[i]),
.ba (ddr2_ba_reg),
.addr (ddr2_address_reg),
.dq (ddr2_dq[(8*(i+1))-1 : i*8]),
.dqs (ddr2_dqs[i]),
.dqs_n (ddr2_dqs_n[i]),
.rdqs_n (),
.odt (ddr2_odt_reg)
);
end
end
else begin
// if the memory part is component or unbuffered DIMM
for(i = 0; i < `DATA_STROBE_WIDTH; i = i+1) begin: u3
ddr2_model u_mem0
(
.ck (ddr2_clk[i]),
.ck_n (ddr2_clk_n[i]),
.cke (ddr2_cke),
.cs_n (ddr2_cs_n),
.ras_n (ddr2_ras_n),
.cas_n (ddr2_cas_n),
.we_n (ddr2_we_n),
.dm_rdqs (ddr2_dm[i]),
.ba (ddr2_ba),
.addr (ddr2_address),
.dq (ddr2_dq[(8*(i+1))-1 : i*8]),
.dqs (ddr2_dqs[i]),
.dqs_n (ddr2_dqs_n[i]),
.rdqs_n (),
.odt (ddr2_odt)
);
end
end
end else
if (DEVICE_WIDTH == 4) begin
// if the memory part is x4
if ( REG_ENABLE ) begin
// if the memory part is Registered DIMM
for(i = 0; i < `DATA_STROBE_WIDTH; i = i+1) begin: u4
ddr2_model u_mem0
(
.ck (ddr2_clk[`CLK_WIDTH*i/`DATA_STROBE_WIDTH]),
.ck_n (ddr2_clk_n[`CLK_WIDTH*i/`DATA_STROBE_WIDTH]),
.cke (ddr2_cke_reg),
.cs_n (ddr2_cs_n_reg),
.ras_n (ddr2_ras_n_reg),
.cas_n (ddr2_cas_n_reg),
.we_n (ddr2_we_n_reg),
.dm_rdqs (ddr2_dm[i/2]),
.ba (ddr2_ba_reg),
.addr (ddr2_address_reg),
.dq (ddr2_dq[(4*(i+1))-1 : i*4]),
.dqs (ddr2_dqs[i]),
.dqs_n (ddr2_dqs_n[i]),
.rdqs_n (),
.odt (ddr2_odt_reg)
);
end
end
else begin
// if the memory part is component or unbuffered DIMM
for(i = 0; i < `DATA_STROBE_WIDTH; i = i+1) begin: u5
ddr2_model u_mem0
(
.ck (ddr2_clk[i]),
.ck_n (ddr2_clk_n[i]),
.cke (ddr2_cke),
.cs_n (ddr2_cs_n),
.ras_n (ddr2_ras_n),
.cas_n (ddr2_cas_n),
.we_n (ddr2_we_n),
.dm_rdqs (ddr2_dm[i/2]),
.ba (ddr2_ba),
.addr (ddr2_address),
.dq (ddr2_dq[(4*(i+1))-1 : i*4]),
.dqs (ddr2_dqs[i]),
.dqs_n (ddr2_dqs_n[i]),
.rdqs_n (),
.odt (ddr2_odt)
);
end
end
end
endgenerate
endmodule // sim_tb_top
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?