📄 sdrsd50_071010.v
字号:
//TRAS_PP[bank_id] = $realtobits(CUR_TIME); // save current time for tRCD,tRC check. case(bank_id)//TRAS_PP 'd0: TRAS_PP0 = CUR_TIME; 'd1: TRAS_PP1 = CUR_TIME; 'd2: TRAS_PP2 = CUR_TIME; 'd3: TRAS_PP3 = CUR_TIME; endcase//TRAS_PP TRAS_P = CUR_TIME; end // active operation/* *----------------------------------------------------- * READ command *----------------------------------------------------- */always @(read) begin :read_block integer bank_id; reg [8*8:1] str; if(CUR_TIME - TCAS_P < `tCCD-`MARGIN) begin $display("Warning: tCCD violation at %t", CUR_TIME); disable read_block; end `ifdef M128_M256_X4 // 98.6.30 BYC c_addr = {addr[11],addr[`nCOL-2:0]}; `else c_addr = addr[`BIT_C]; `endif c_bank_addr = ba; bank_id = BankSelect(ba); str = PrintBank(ba); //if(CUR_TIME - $bitstoreal(TRAS_PP[bank_id]) < `tRCD-`MARGIN) if ((bank_id == 0) && (CUR_TIME - TRAS_PP0 < `tRCD-`MARGIN) || (bank_id == 1) && (CUR_TIME - TRAS_PP1 < `tRCD-`MARGIN) || (bank_id == 2) && (CUR_TIME - TRAS_PP2 < `tRCD-`MARGIN) || (bank_id == 3) && (CUR_TIME - TRAS_PP3 < `tRCD-`MARGIN)) begin $display("Warning: tRCD violation at %t", CUR_TIME); disable read_block; end r_addr = r_addr_[bank_id];`endprotect if(Mode[bank_id] == `TRUE) begin if( addr[`ADDR_AP] == `TRUE) begin`ifdef v $display(">> read with auto precharge(%0s) at %t",str,CUR_TIME);`endif auto_flag[bank_id] <= @(negedge pclk) `TRUE; rd_autoprech_reg <= @(negedge pclk) ba; end else begin`ifdef v $display(">> read (%0s) at %t ",str,CUR_TIME);`endif auto_flag[bank_id] <= @(negedge pclk) `FALSE; end end else begin`ifdef v $display("Illegal Read %0s is not activated",str);`endif disable read_block; end READ_MODE = `TRUE; // read operation start TCAS_P = CUR_TIME; m_addr = {r_addr, c_addr}; if(~burst_type) increment_read; else interleave_read; `ifdef M16G4_M64G3 `else if( auto_flag[bank_id] ) begin if( BL != 1) auto_flagx <= @(negedge pclk) `TRUE; ->autostart; end `endif read_task; // task call READ_MODE = `FALSE; // read operation end.// last_rw = CUR_TIME; last_rw = TCLK_H; if( auto_flag[bank_id] ) begin// rd_autoprech_reg = c_bank_addr; if ({CSB_FLAG,RASB_FLAG,CASB_FLAG} == 3'b010 && bank_id === ba) $display($time, " Warning: For actual device, this gapless command would be illegal"); else ->rd_autoprecharge; end end/* *----------------------------------------------------- * WRITE command *----------------------------------------------------- *///always @(write)always @(posedge write_event)//KyW ... 0408 for VCS begin:write_block integer bank_id; reg [8*8:1] str; if(CUR_TIME - TCAS_P < `tCCD-`MARGIN) begin $display("Warning: tCCD violation at %t", CUR_TIME); disable write_block; end `ifdef M128_M256_X4 // 98.6.30 BYC c_addr = {addr[11],addr[`nCOL-2:0]}; `else c_addr = addr[`BIT_C]; `endif c_bank_addr = ba; bank_id = BankSelect(ba); str = PrintBank(ba); r_addr = r_addr_[bank_id]; //if(CUR_TIME - $bitstoreal(TRAS_PP[bank_id]) < `tRCD-`MARGIN) if ((bank_id == 0) && (CUR_TIME - TRAS_PP0 < `tRCD-`MARGIN) || (bank_id == 1) && (CUR_TIME - TRAS_PP1 < `tRCD-`MARGIN) || (bank_id == 2) && (CUR_TIME - TRAS_PP2 < `tRCD-`MARGIN) || (bank_id == 3) && (CUR_TIME - TRAS_PP3 < `tRCD-`MARGIN)) begin $display("Warning: tRCD violation at %t", CUR_TIME); disable write_block; end if(Mode[bank_id] == `TRUE) begin if(addr[`ADDR_AP]) begin`ifdef v $display(">> write with auto precharge( %0s ) at %t",str,CUR_TIME);`endif auto_flag[bank_id] <= @(negedge pclk) `TRUE;//`ifdef RDL2 if (`tRDL == 2) wr_autoprech_reg2 <= @(negedge pclk) ba;//`else else wr_autoprech_reg <= @(negedge pclk) ba;//`endif end else begin`ifdef v $display(">> write ( %0s ) at %t",str,CUR_TIME);`endif auto_flag[bank_id] <= @(negedge pclk) `FALSE;/* if (auto_flag == `TRUE && autoprech_reg == ba) auto_flag = `FALSE;*/ end end else begin $display("Warning: Illegal write command at %t",CUR_TIME); disable write_block; end WRITE_MODE = `TRUE; TCAS_P = CUR_TIME; m_addr = {r_addr, c_addr}; `ifdef M16G4_M64G3 `else if( auto_flag[bank_id] ) begin if( WBL != 1) auto_flagx <= @(negedge pclk) `TRUE; ->autostart; end `endif write_task; WRITE_MODE <= #(`tSH) `FALSE; last_rw = CUR_TIME; @(posedge pclk); if(auto_flag[bank_id]) begin if ({CSB_FLAG,RASB_FLAG,CASB_FLAG} == 3'b010 && bank_id === ba) $display($time, " Warning: For actual device, this gapless command would be illegal"); else begin//`ifdef RDL2 if (`tRDL == 2) #0 ->wr_autoprecharge2;//`else else ->wr_autoprecharge;//`endif end end end`protect// In bank interleave write mode, din data should be stored // in din register as the other bank selection occurred.always @(flush_write) begin if(~burst_type) increment_write; else interleave_write; end/* *----------------------------------------------------- * REFRESH command *----------------------------------------------------- */always @(autorefresh) begin : auto_op if (INIT == `FALSE && MRS_SET == `FALSE) // for refersh protection during MRS_ING begin $display("Warning: Illegal refresh command at %t",CUR_TIME); disable auto_op; end if (|Mode !== 1'b0) begin $display("Warning: Illegal refresh command at %t",CUR_TIME); disable auto_op; end/* -- jhkim-TEST `ifdef M16G4_M64G3 `else for(i=0; i < `nBank; i=i+1) begin //if( CUR_TIME - $bitstoreal(TRAS_PP[i]) < `tRFC-`MARGIN ) if ((i == 0) && (CUR_TIME - TRAS_PP0 < `tRFC-`MARGIN) || (i == 1) && (CUR_TIME - TRAS_PP1 < `tRFC-`MARGIN) || (i == 2) && (CUR_TIME - TRAS_PP2 < `tRFC-`MARGIN) || (i == 3) && (CUR_TIME - TRAS_PP3 < `tRFC-`MARGIN)) $display("Warning: tRFC violation at %t",CUR_TIME); end `endif*/ AUTOREF_MODE = `TRUE;`ifdef v//`ifdef NOKIA// if (REF16M_MODE == `TRUE) // $display(">> partial auto refresh (16M) at %t",CUR_TIME);// else if (REF32M_MODE == `TRUE)// $display(">> partial auto refresh (32M) at %t",CUR_TIME);// else//`endif $display(">> auto refresh at %t",CUR_TIME);`endif/* -- jhkim-TEST `ifdef M16G4_M64G3 AUTOREF_MODE = #(`tRC) `FALSE; `else AUTOREF_MODE = #(`tRFC) `FALSE; `endif*/ AUTOREF_MODE = #(`tRC) `FALSE; end /* *----------------------------------------------------- * SELF REFRESH command *----------------------------------------------------- */always @(selfrefresh) begin : self_op if (|Mode == 1'b0) begin SELFREF_MODE = `TRUE;`ifdef v`ifdef NOKIA if (REF16M_MODE == `TRUE) $display(">> partial self refresh (16M) enter at %t",CUR_TIME); else if (REF32M_MODE == `TRUE) $display(">> partial self refresh (32M) enter at %t",CUR_TIME); else`endif`ifdef MOBILE if (REF4BANK == `TRUE) $display(">> Partial Array Self Refresh (4banks) enter at %t",CUR_TIME); else if (REF2BANK == `TRUE) $display(">> Partial Array Self Refresh (2banks) enter at %t",CUR_TIME); else if (REF1BANK == `TRUE) $display(">> Partial Array Self Refresh (1banks) enter at %t",CUR_TIME); else`endif $display(">> self refresh enter at %t",CUR_TIME);`endif TSELF = CUR_TIME; end else begin $display("Warning: Illegal self refresh command at %t",CUR_TIME); disable self_op; end for(i =0; i < `nBank; i = i+1) begin/* -- jhkim-TEST `ifdef M16G4_M64G3 //if( CUR_TIME - $bitstoreal(TRAS_PP[i]) < `tRC-`MARGIN ) if ((i == 0) && (CUR_TIME - TRAS_PP0 < `tRC-`MARGIN) || (i == 1) && (CUR_TIME - TRAS_PP1 < `tRC-`MARGIN) || (i == 2) && (CUR_TIME - TRAS_PP2 < `tRC-`MARGIN) || (i == 3) && (CUR_TIME - TRAS_PP3 < `tRC-`MARGIN)) $display("Warning: tRC violation at %t",CUR_TIME); `else //if( CUR_TIME - $bitstoreal(TRAS_PP[i]) < `tRFC-`MARGIN ) if ((i == 0) && (CUR_TIME - TRAS_PP0 < `tRFC-`MARGIN) || (i == 1) && (CUR_TIME - TRAS_PP1 < `tRFC-`MARGIN) || (i == 2) && (CUR_TIME - TRAS_PP2 < `tRFC-`MARGIN) || (i == 3) && (CUR_TIME - TRAS_PP3 < `tRFC-`MARGIN)) $display("Warning: tRFC violation at %t",CUR_TIME); `endif*/ //if( CUR_TIME - $bitstoreal(TRAS_PP[i]) < `tRC-`MARGIN ) if ((i == 0) && (CUR_TIME - TRAS_PP0 < `tRC-`MARGIN) || (i == 1) && (CUR_TIME - TRAS_PP1 < `tRC-`MARGIN) || (i == 2) && (CUR_TIME - TRAS_PP2 < `tRC-`MARGIN) || (i == 3) && (CUR_TIME - TRAS_PP3 < `tRC-`MARGIN)) $display("Warning: tRC violation at %t",CUR_TIME); end end always @(selfexit) begin TSEXIT = CUR_TIME;/* -- jhkim-TEST `ifdef M16G4_M64G3 SELFREF_MODE = #(`tRC) `FALSE; `else SELFREF_MODE = #(`tRFC) `FALSE; `endif*/ SELFREF_MODE = #(`tRC) `FALSE;end/*always @(negedge cke) begin if (SELFREF_MODE == `TRUE && POWERDOWN_MODE == `FALSE) begin if (CUR_TIME - TSEXIT < `tSRX-`MARGIN) $display("Warning: tSRX violation at %t", CUR_TIME); endend*/`endprotect/* *----------------------------------------------------- * PRECHARGE command *----------------------------------------------------- */// precharge command performs to disable active operation.always @(precharge) begin : prech_op integer bank_id; integer i; reg [8*8:1] str; reg [8*8:1] str1; `ifdef NBANK4 bank_id = BankSelect(prech_reg[2:1]); str = PrintBank(prech_reg[2:1]); `endif `ifdef NBANK2 bank_id = BankSelect(prech_reg[1]); str = PrintBank(prech_reg[1]); `endif`protect if(prech_reg[0] == `FALSE) begin if(Mode[bank_id] !== 1'b0) begin //if(CUR_TIME - $bitstoreal(TRAS_PP[bank_id]) < `tRASmin-`MARGIN) if ((bank_id == 0) && (CUR_TIME - TRAS_PP0 < `tRASmin-`MARGIN) || (bank_id == 1) && (CUR_TIME - TRAS_PP1 < `tRASmin-`MARGIN) || (bank_id == 2) && (CUR_TIME - TRAS_PP2 < `tRASmin-`MARGIN) || (bank_id == 3) && (CUR_TIME - TRAS_PP3 < `tRASmin-`MARGIN)) begin $display("Warning: tRASmin violation( %0s ) at %t", str, CUR_TIME); disable prech_op; end //if(first_pre[bank_id]==`FALSE && CUR_TIME - $bitstoreal(TRAS_PP[bank_id]) > `tRASmax+`MARGIN) if (first_pre[bank_id]==`FALSE && ((bank_id == 0) && (CUR_TIME - TRAS_PP0 > `tRASmax-`MARGIN) || (bank_id == 1) && (CUR_TIME - TRAS_PP1 > `tRASmax-`MARGIN) || (bank_id == 2) && (CUR_TIME - TRAS_PP2 > `tRASmax-`MARGIN) || (bank_id == 3) && (CUR_TIME - TRAS_PP3 > `tRASmax-`MARGIN))) $display("Warning: tRASmax violation( %0s ) at %t", str, CUR_TIME); first_pre[bank_id] = `FALSE; md = Mode; md[bank_id] = 0; Mode = md;`ifdef v $display(">> precharge ( %0s ) at %t", str, CUR_TIME);`endif end else begin`ifdef v $display("-- current precharge command is NOP at %t",CUR_TIME);`endif disable prech_op; end precharge_flag[bank_id] = `TRUE; kill_bank = bank_id; ->precharge_flag_kill; //TPRE_P[bank_id] = $realtobits(CUR_TIME); case(bank_id)//TPRE_P 'd0: TPRE_P0 = CUR_TIME; 'd1: TPRE_P1 = CUR_TIME; 'd2: TPRE_P2 = CUR_TIME; 'd3: TPRE_P3 = CUR_TIME; endcase//TPRE_P end else begin if(|Mode[`nBank-1:0] !== 1'b0) // BYC begin for(i = 0; i < `nBank; i = i+1) begin case(i) 'd0 : str1 = " A Bank"; 'd2 : str1 = " B Bank"; 'd1 :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -