📄 odt_watchdog.v
字号:
if (wr_cmd_count_en[i] && (int_burst_len == 8) && (cas_lat == 3) &&
(wr_cmd_counter[i] >= add_lat-1) && (wr_cmd_counter[i] < (cas_lat+add_lat))) begin
if (wr_ddr_cs_n_d[i] == 4'b0111 && !ddr_odt[2])
$display ("ODT ERROR: ddr_odt[2] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 4'b1110 && !ddr_odt[3])
$display ("ODT ERROR: ddr_odt[3] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 4'b1101 && !ddr_odt[3])
$display ("ODT ERROR: ddr_odt[3] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 4'b1011 && !ddr_odt[3])
$display ("ODT ERROR: ddr_odt[3] should be high at time %0t\n",$time);
end
else if (wr_cmd_count_en[i] && int_burst_len == 8 && (cas_lat == 4) &&
(wr_cmd_counter[i] >= add_lat) && (wr_cmd_counter[i] < (cas_lat+add_lat))) begin
if (wr_ddr_cs_n_d[i] == 4'b0111 && !ddr_odt[2])
$display ("ODT ERROR: ddr_odt[2] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 4'b1110 && !ddr_odt[3])
$display ("ODT ERROR: ddr_odt[3] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 4'b1101 && !ddr_odt[3])
$display ("ODT ERROR: ddr_odt[3] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 4'b1011 && !ddr_odt[3])
$display ("ODT ERROR: ddr_odt[3] should be high at time %0t\n",$time);
end
end
`endif
if (!(|wr_cmd_count_en) && !(|cmd_count_en) && |ddr_odt && ((cas_lat+add_lat) > 4))
$display ("ODT ERROR: ddr_odt asserted when it should not be at time %0t\n",$time);
end
`endif
`ifdef CS_WIDTH_8
always @ (posedge mem_clk) begin
if (mem_rd_cmd) begin
// edge 0 should sample ODT asserted
if ((cas_lat + add_lat) == 3) begin
if (ddr_cs_n == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
end
//----------------------------------------------------------
if (mem_wr_cmd) begin
// edge 0 should sample ODT asserted
if ((cas_lat + add_lat) < 5) begin
if (ddr_cs_n == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
// edge -1 should have sampled ODT asserted
if ((cas_lat + add_lat) == 3) begin
if (ddr_cs_n == 8'b0111_1111 && !flop_ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should have been high a clock cycle earlier at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1110 && !flop_ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should have been high a clock cycle earlier at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1101 && !flop_ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should have been high a clock cycle earlier at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_1011 && !flop_ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should have been high a clock cycle earlier at time %0t\n",$time);
if (ddr_cs_n == 8'b1111_0111 && !flop_ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should have been high a clock cycle earlier at time %0t\n",$time);
if (ddr_cs_n == 8'b1110_1111 && !flop_ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should have been high a clock cycle earlier at time %0t\n",$time);
if (ddr_cs_n == 8'b1101_1111 && !flop_ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should have been high a clock cycle earlier at time %0t\n",$time);
if (ddr_cs_n == 8'b1011_1111 && !flop_ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should have been high a clock cycle earlier at time %0t\n",$time);
end
end
//----------------------------------------------------------
// ODT detection for read commands
for (i=0; i<8; i=i+1) begin
if (cmd_count_en[i] && int_burst_len == 4 && (cas_lat == 3) &&
(cmd_counter[i] >= add_lat) && (cmd_counter[i] < (cas_lat+add_lat-1))) begin
if (ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
else if (cmd_count_en[i] && int_burst_len == 4 && (cas_lat == 4) &&
(cmd_counter[i] >= add_lat+1) && (cmd_counter[i] < (cas_lat+add_lat-1))) begin
if (ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
if (cmd_count_en[i] && int_burst_len == 8 && (cas_lat == 3) &&
(cmd_counter[i] >= add_lat) && (cmd_counter[i] < (cas_lat+add_lat+1))) begin
if (ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
else if (cmd_count_en[i] && int_burst_len == 8 && (cas_lat == 4) &&
(cmd_counter[i] >= add_lat+1) && (cmd_counter[i] < (cas_lat+add_lat+1))) begin
if (ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
end
//----------------------------------------------------------
// ODT detection for write commands
for (i=0; i<8; i=i+1) begin
if (wr_cmd_count_en[i] && (int_burst_len == 4) && (cas_lat == 3) &&
(wr_cmd_counter[i] >= add_lat-1) && (wr_cmd_counter[i] < (cas_lat+add_lat-2))) begin
if (wr_ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
else if (wr_cmd_count_en[i] && (int_burst_len == 4) && (cas_lat == 4) &&
(wr_cmd_counter[i] >= add_lat) && (wr_cmd_counter[i] < (cas_lat+add_lat-2))) begin
if (wr_ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
if (wr_cmd_count_en[i] && (int_burst_len == 8) && (cas_lat == 3) &&
(wr_cmd_counter[i] >= add_lat-1) && (wr_cmd_counter[i] < (cas_lat+add_lat))) begin
if (wr_ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
else if (wr_cmd_count_en[i] && int_burst_len == 8 && (cas_lat == 4) &&
(wr_cmd_counter[i] >= add_lat) && (wr_cmd_counter[i] < (cas_lat+add_lat))) begin
if (wr_ddr_cs_n_d[i] == 8'b0111_1111 && !ddr_odt[6])
$display ("ODT ERROR: ddr_odt[6] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1110 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1101 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_1011 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1111_0111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1110_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1101_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
if (wr_ddr_cs_n_d[i] == 8'b1011_1111 && !ddr_odt[7])
$display ("ODT ERROR: ddr_odt[7] should be high at time %0t\n",$time);
end
end
if (!(|wr_cmd_count_en) && !(|cmd_count_en) && |ddr_odt && ((cas_lat+add_lat) > 4))
$display ("ODT ERROR: ddr_odt asserted when it should not be at time %0t\n",$time);
end
`endif
///////////////////////////////////////////////////////////////////////
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -