⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddr2_model.v

📁 DDR2 SDRAM仿真模型
💻 V
📖 第 1 页 / 共 5 页
字号:
                                    end                                    // DLL Reset                                    dll_reset = addr[8];                                    if (!dll_reset) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Normal", $time, cmd_string[cmd], bank);                                    end else if (dll_reset) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Reset DLL", $time, cmd_string[cmd], bank);                                        dll_locked = 0;                                        ck_dll_reset <= ck_cntr;                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal DLL Reset = %d", $time, cmd_string[cmd], bank, dll_reset);                                    end                                    // Write Recovery                                    write_recovery  = addr[11:9] + 1;                                    if ((write_recovery >= WR_MIN) && (write_recovery <= WR_MAX)) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery);                                    end                                    // Power Down Mode                                    low_power = addr[12];                                    if (!low_power) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Fast Exit", $time, cmd_string[cmd], bank);                                    end else if (low_power) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Slow Exit", $time, cmd_string[cmd], bank);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal Power Down Mode = %d", $time, cmd_string[cmd], bank, low_power);                                    end                                end                                1 : begin                                    // DLL Enable                                    dll_en = !addr[0];                                    if (!dll_en) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Disabled", $time, cmd_string[cmd], bank);                                    end else if (dll_en) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Enabled", $time, cmd_string[cmd], bank);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal DLL Enable = %d", $time, cmd_string[cmd], bank, dll_en);                                    end                                    // Output Drive Strength                                    if (!addr[1]) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Full", $time, cmd_string[cmd], bank);                                    end else if (addr[1]) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Reduced", $time, cmd_string[cmd], bank);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal Output Drive Strength = %d", $time, cmd_string[cmd], bank, addr[1]);                                    end                                    // ODT Rtt                                    odt_rtt = {addr[6], addr[2]};                                    if (odt_rtt == 2'b00) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = Disabled", $time, cmd_string[cmd], bank);                                        odt_en = 0;                                    end else if (odt_rtt == 2'b01) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 75 Ohm", $time, cmd_string[cmd], bank);                                        odt_en = 1;                                        tm_odt_en <= $time;                                    end else if (odt_rtt == 2'b10) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 150 Ohm", $time, cmd_string[cmd], bank);                                        odt_en = 1;                                        tm_odt_en <= $time;                                    end else if (odt_rtt == 2'b11) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 50 Ohm", $time, cmd_string[cmd], bank);                                        odt_en = 1;                                        tm_odt_en <= $time;                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal ODT Rtt = %d", $time, cmd_string[cmd], bank, odt_rtt);                                        odt_en = 0;                                    end                                    // Additive Latency                                    additive_latency = addr[5:3];                                    read_latency = cas_latency + additive_latency;                                    write_latency = read_latency - 1;                                    if ((additive_latency >= AL_MIN) && (additive_latency <= AL_MAX)) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency);                                    end                                    // OCD Program                                    ocd = addr[9:7];                                    if (ocd == 3'b000) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Exit", $time, cmd_string[cmd], bank);                                    end else if (ocd == 3'b111) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Default", $time, cmd_string[cmd], bank);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal OCD Program = %b", $time, cmd_string[cmd], bank, ocd);                                    end                                    // DQS_N Enable                                    dqs_n_en = !addr[10];                                    if (!dqs_n_en) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Disabled", $time, cmd_string[cmd], bank);                                    end else if (dqs_n_en) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Enabled", $time, cmd_string[cmd], bank);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal DQS_N Enable = %d", $time, cmd_string[cmd], bank, dqs_n_en);                                    end                                     // RDQS Enable                                    rdqs_en = addr[11];                                    if (!rdqs_en) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Disabled", $time, cmd_string[cmd], bank);                                    end else if (rdqs_en) begin`ifdef x8                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Enabled", $time, cmd_string[cmd], bank);`else                                        $display ("%m: at time %t WARNING: %s %d Illegal RDQS Enable.  RDQS only exists on a x8 part", $time, cmd_string[cmd], bank);                                        rdqs_en = 0;`endif                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal RDQS Enable = %d", $time, cmd_string[cmd], bank, rdqs_en);                                    end                                     // Output Enable                                    out_en = !addr[12];                                    if (!out_en) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Disabled", $time, cmd_string[cmd], bank);                                    end else if (out_en) begin                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Enabled", $time, cmd_string[cmd], bank);                                    end else begin                                        $display ("%m: at time %t ERROR: %s %d Illegal Output Enable = %d", $time, cmd_string[cmd], bank, out_en);                                    end                                 end                                2, 3 : begin                                    if (addr !== 0) begin                                        $display ("%m: at time %t ERROR: %s %d Illegal value.  Reserved bits must be programmed to zero", $time, cmd_string[cmd], bank);                                    end                                end                            endcase                            init_mode_reg[bank] = 1;                            ck_load_mode <= ck_cntr;                        end                    end                    REFRESH : begin                        if (|active_bank) begin                            $display ("%m: at time %t ERROR: %s Failure.  All banks must be Precharged.", $time, cmd_string[cmd]);                            if (STOP_ON_ERROR) $stop(0);                        end else begin                            if (DEBUG) $display ("%m: at time %t INFO: %s", $time, cmd_string[cmd]);                            er_trfc_max = 0;                            ref_cntr = ref_cntr + 1;                            tm_refresh <= $time;                        end                    end                    PRECHARGE : begin                        // tRPA timing applies when the PRECHARGE (ALL) command is issued, regardless of                        // the number of banks already open or closed.                        if (addr[AP] && (`BANKS == 8)) begin                            if (DEBUG) $display ("%m: at time %t INFO: %s All", $time, cmd_string[cmd]);                            precharge_all = 1'b1;                        end                        // PRECHARGE command will be treated as a NOP if there is no open row in that bank (idle state),                         // or if the previously open row is already in the process of precharging                        if (|active_bank) begin                            for (i=0; i<`BANKS; i=i+1) begin                                if (active_bank[i]) begin                                    if (addr[AP] || (i == bank)) begin                                        for (j=0; j<NOP; j=j+1) begin                                            chk_err(1'b0, i, j, cmd);                                            chk_err(1'b1, i, j, cmd);                                        end                                        chk_err(1'b0, i, PWR_DOWN, cmd);                                        chk_err(1'b0, i, SELF_REF, cmd);                                        if (auto_precharge_bank[i]) begin                                            $display ("%m: at time %t ERROR: %s Failure.  Auto Precharge is scheduled to bank %d.", $time, cmd_string[cmd], i);                                            if (STOP_ON_ERROR) $stop(0);                                        end else begin                                            if (DEBUG) $display ("%m: at time %t INFO: %s bank %d", $time, cmd_string[cmd], i);                                            active_bank[i] = 1'b0;                                            tm_bank_precharge[i] <= $time;                                            tm_precharge <= $time;                                        end                                    end                                end                            end                        end                    end                    ACTIVATE : begin                        if (`BANKS == 8) begin                            tfaw_cntr = 0;                            for (i=0; i<`BANKS; i=i+1) begin                                if ($time - tm_bank_activate[i] < TFAW) begin                                    tfaw_cntr = tfaw_cntr + 1;                                end                            end                            if (tfaw_cntr > 3) begin                                $display ("%m: at time %t ERROR:  tFAW violation during %s to bank %d", $time, cmd_string[cmd], bank);                            end                        end                        if (!init_done) begin                            $display ("%m: at time %t ERROR: %s Failure.  Initialization sequence is not complete.", $time, cmd_string[cmd]);                            if (STOP_ON_ERROR) $stop(0);                        end else if (active_bank[bank]) begin                            $display ("%m: at time %t ERROR: %s Failure.  Bank %d must be Precharged.", $time, cmd_string[cmd], bank);                            if (STOP_ON_ERROR) $stop(0);                        end else begin                            if (addr >= 1<<ROW_BITS) begin                                $display ("%m: at time %t WARNING: row = %h does not exist.  Maximum row = %h", $time, addr, (1<<ROW_BITS)-1);                            end                            if (DEBUG) $display ("%m: at time %t INFO: %s bank %d row %h", $time, cmd_string[cmd], bank, addr);                            active_bank[bank] = 1'b1;                            active_row[bank] = addr;                            tm_bank_activate[bank] <= $time;                            tm_activate <= $time;                        end                                            end                    WRITE : begin                        if (!init_done) begin                            $display ("%m: at time %t ERROR: %s Failure.  Initialization sequence is not complete.", $time, cmd_string[cmd]);                            if (STOP_ON_ERROR) $stop(0);                        end else if (!active_bank[bank]) begin                            $display ("%m: at time %t ERROR: %s Failure.  Bank %d must be Activated.", $time, cmd_string[cmd], bank);                            if (STOP_ON_ERROR) $stop(0);                        end else if (auto_precharge_bank[bank]) begin                            $display ("%m: at time %t ERROR: %s Failure.  Auto Precharge is scheduled to bank %d.", $time, cmd_string[cmd], bank);                            if (STOP_ON_ERROR) $stop(0);                        end else if ((ck_cntr - ck_write < burst_length/2) && (ck_cntr - ck_write)%2) begin                            $display ("%m: at time %t ERROR: %s Failure.  Illegal burst interruption.", $time, cmd_string[cmd]);                            if (STOP_ON_ERROR) $stop(0);                        end else begin                            if (addr[AP]) begin                                auto_precharge_bank[bank] = 1'b1;                                write_precharge_bank[bank] = 1'b1;                            end                            col = ((addr>>1) & -1*(1<<AP)) | (addr & {AP{1'b1}});                            if (col >= 1<<COL_BITS) begin                                $display ("%m: at time %t WARNING: col = %h does not exist.  Maximum col = %h", $time, col, (1<<COL_BITS)-1);                            end                            if (DEBUG) $display ("%m: at time %t INFO: %s bank %d col %h, auto precharge %d", $time, cmd_string[cmd], bank, col, addr[AP]);                            wr_pipeline[2*write_latency + 1]  = 1;                            ba_pipeline[2*write_latency + 1]  = bank;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -