odt_watchdog.v

来自「DDR2 的控制器」· Verilog 代码 · 共 1,126 行 · 第 1/4 页

V
1,126
字号
        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 + =
减小字号Ctrl + -
显示快捷键?