📄 test.v
字号:
input [data_bits - 1 : 0] dq2;
input [data_bits - 1 : 0] dq3; // Last Data
begin
Cke = 1'b1;
Cs_n = 1'b0;
Ras_n = 1'b1;
Cas_n = 1'b0;
We_n = 1'b0;
Dm = 1'b0;
Ba = ba;
Addr = addr;
Dq = HiZ;
Dqs = 1'bz;
#half_clk; Dqs = 1'b0;
#half_clk; Cas_n = 1'b1;
We_n = 1'b1;
#quar_clk; Dq = dq0;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq1;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = dq2;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq3;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = HiZ;
#quar_clk; Dqs = 1'bz;
#half_clk;
#full_clk;
end
endtask
// Write Burst Length = 8
task write_8;
input [1 : 0] ba; // Bank
input [addr_bits - 1 : 0] addr; // Column
input [data_bits - 1 : 0] dq0; // First Data
input [data_bits - 1 : 0] dq1;
input [data_bits - 1 : 0] dq2;
input [data_bits - 1 : 0] dq3;
input [data_bits - 1 : 0] dq4;
input [data_bits - 1 : 0] dq5;
input [data_bits - 1 : 0] dq6;
input [data_bits - 1 : 0] dq7; // Last Data
begin
Cke = 1'b1;
Cs_n = 1'b0;
Ras_n = 1'b1;
Cas_n = 1'b0;
We_n = 1'b0;
Dm = 1'b0;
Ba = ba;
Addr = addr;
Dq = HiZ;
Dqs = 1'bz;
#half_clk; Dqs = 1'b0;
#half_clk; Cas_n = 1'b1;
We_n = 1'b1;
#quar_clk; Dq = dq0;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq1;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = dq2;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq3;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = dq4;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq5;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = dq6;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq7;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = HiZ;
#quar_clk; Dqs = 1'bz;
#half_clk;
#full_clk;
end
endtask
// Write Burst Length = 4
// Even burst with precharge terminate (for testing tWR)
task write_4_even;
input [1 : 0] ba; // Bank
input [addr_bits - 1 : 0] addr; // Column
input [data_bits - 1 : 0] dq0; // First Data
input [data_bits - 1 : 0] dq1;
input [data_bits - 1 : 0] dq2;
input [data_bits - 1 : 0] dq3; // Last Data
begin
Cke = 1'b1;
Cs_n = 1'b0;
Ras_n = 1'b1;
Cas_n = 1'b0;
We_n = 1'b0;
Dm = 1'b0;
Ba = ba;
Addr = addr;
Dq = HiZ;
Dqs = 1'bz;
#half_clk; Dqs = 1'b0;
#half_clk; Cas_n = 1'b1;
We_n = 1'b1;
#quar_clk; Dq = dq0;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq1;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = dq2; Dm = 1'b1;
#quar_clk; Dqs = 1'b1;
#quar_clk; Dq = dq3; Dm = 1'b1;
#quar_clk; Dqs = 1'b0;
#quar_clk; Dq = HiZ;
#quar_clk; Dqs = 1'bz;
#half_clk; Ras_n = 1'b1; We_n = 1'b1; // Nop - extra nop here pass tWR check
#full_clk; Ras_n = 1'b0; We_n = 1'b0; // Precharge
#full_clk; Ras_n = 1'b1; We_n = 1'b1; // Nop
#full_clk;
end
endtask
initial begin
begin
// POWERUP SECTION
//power_up;
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
// INITIALIZE SECTION
precharge (2'b00, 1024); // Precharge all banks
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
load_mode_reg (2'b01, 12'b00000_000_0_000); // Extended Mode Register (Enable DLL)
nop (HiZ, 1'bz, 1'b0);
load_mode_reg (2'b00, 12'b00010_010_0_010); // Load Mode Register (DLL Reset, CL=2, BL=4)
nop (HiZ, 1'bz, 1'b0);
load_mode_reg (2'b00, 12'b00000_010_0_010); // Load Mode Register (CL=2, BL=4, this second LMR is not needed on Micron DDR SDRAM)
nop (HiZ, 1'bz, 1'b0);
precharge (2'b00, 1024); // Precharge all banks
nop (HiZ, 1'bz, 1'b0);
auto_refresh;
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
auto_refresh;
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
active (2'b00, 0, HiZ, 1'bz, 1'b0); // Active Bank 0, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
write_4 (2'b00, 1024, 10, 11, 12, 13); // Write Bank 0, Col 0
active (2'b01, 0, HiZ, 1'bz, 1'b0); // Active Bank 1, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
write_4 (2'b01, 1024, 20, 21, 22, 23); // Write Bank 1, Col 0
active (2'b10, 0, HiZ, 1'bz, 1'b0); // Active Bank 2, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
write_4 (2'b10, 1024, 30, 31, 32, 33); // Write Bank 2, Col 0
active (2'b11, 0, HiZ, 1'bz, 1'b0); // Active Bank 3, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
write_4 (2'b11, 1024, 40, 41, 42, 43); // Write Bank 3, Col 0
// DLL RESET ENABLE - you will need 200 tCK before any read command.
#(200*full_clk);
active (2'b00, 0, HiZ, 1'bz, 1'b0); // Active Bank 0, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
read (2'b00, 1024); // Read Bank 0, Col 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
active (2'b01, 0, HiZ, 1'bz, 1'b0); // Active Bank 1, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
read (2'b01, 1024); // Read Bank 1, Col 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
active (2'b10, 0, HiZ, 1'bz, 1'b0); // Active Bank 2, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
read (2'b10, 1024); // Read Bank 2, Col 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
active (2'b11, 0, HiZ, 1'bz, 1'b0); // Active Bank 3, Row 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
read (2'b11, 1024); // Read Bank 3, Col 0
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
nop (HiZ, 1'bz, 1'b0);
end
$stop;
$finish;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -