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

📄 dc_s_decode.v

📁 verilog, TMSC6415 S单元代码
💻 V
📖 第 1 页 / 共 3 页
字号:
      DC_W_Z<=I_DC_W_Z;      SSHL_SHL<=I_SSHL_SHL; //11.19 add             //SSHL_EXT<=I_SSHL_EXT; //11.19 add             SSHL_SHL_EXT<=I_SSHL_SHL_EXT; //11.19 add         SSHL_SHL_Src2Type<=I_SSHL_SHL_Src2Type;//11.19 add          SHR_Src2Type_U<=I_SHR_Src2Type_U;//11.20 add     SHR_SSHL<=I_SHR_SSHL;     SHR_Src2Type<=I_SHR_Src2Type;//11.20 add     EXT_DC_U<=I_EXT_DC_U;//11.20 add     log_reg<=I_log_reg;     use_result<=I_use_result;     logic_use_result<=I_logic_use_result; //08.1.15      DC_W_Src2inv<=I_DC_W_Src2inv;      SUB_RE<=I_SUB_RE;      DC_W_Sinvalid<=I_DC_W_Sinvalid;       //  S_UBranch_Inst<= I_S_UBranch_Inst;    end  endendalways @(posedge clk)begin     if(stall!=1'b1)  //not Dcache miss and Icache miss  begin    DC_W_Src2_Type<=I_DC_W_Src2_Type;    DC_B_Dst_Address<=I_DC_B_Dst_Address;    DC_B_Scondaddr[2:0]<=I_DC_B_Scondaddr[2:0];         DC_B_Src1[31:0]<=I_DC_B_Src1[31:0];    DC_B_Src2[31:0]<=I_DC_B_Src2[31:0];    Cst_BDEC[31:0]<=I_Cst_BDEC [31:0];  endendreg           src1_re; reg           src2_re;reg           src2_cross;reg           pre_DC_W_TriSTre; always@(DP_B_Sfield[0] or DP_B_Sfield[3] or DP_B_Sfield[4] or DP_B_Smode or  DP_B_Sfield[5] or DP_W_Sactive)begin         src1_re=1'b0;     if(~(DP_B_Smode[1] || DP_B_Smode[0] || !DP_B_Sfield[0]))  begin        src1_re=DP_W_Sactive;       end     if(!DP_B_Smode[1]  &&( DP_B_Sfield[3] || DP_B_Sfield[4]||  DP_B_Sfield[5]))    // mode000在field[0]=0情况下读源1的例外分析。按照这种译码方案会在mode001的ADDK和mode100的BCst产生无效读源1请求   //当处于mode101时,这部分的判断可能会和下面的if语句条件重合,但这并不会对结果产生影响。因为mode101一定要读源1。        src1_re=DP_W_Sactive;           if(DP_B_Smode[2] && DP_B_Smode[0])         src1_re=DP_W_Sactive;            end     always@(DP_B_Smode or DP_B_Sfield[1:0] or DP_B_Sfield[6] or DP_B_Sfield[4:3] or DP_W_SBDECBPOS or DP_W_Sactive)begin     case (DP_B_Smode) 3'b000:                             //处理mode 000情况还需要进一步分析:部分指令不读源2,但我们不能确定其field[6]是否为0     if(DP_B_Sfield[6]==1'b0|| DP_W_SBDECBPOS)   begin     //这样在粗译码的情况下可能会产生无效的读交叉通路使能。这种情况是必须要避免的。即使读src2        src2_re   =DP_W_Sactive ;               //部分指令也不读交叉通路,并且也不能确定field[6]是否为0.对于这些情况我们必须区分出来        src2_cross=1'b0;      end else begin                            //else if (!DP_W_SBDECBPOS)        src2_cross=DP_W_Sactive;             //        src2_re   =1'b0;      end 3'b001: begin         src2_re=DP_W_Sactive ;            //采用这种写法是为了避免综合出锁存器         src2_cross=1'b0;          end          3'b010: begin         src2_re=DP_W_Sactive ;         src2_cross=1'b0;          end 3'b011: begin             src2_cross=1'b0;           if(DP_B_Sfield[0]==1'b1)             src2_re=DP_W_Sactive ;         else                         src2_re=1'b0 ;          end 3'b101:     if(DP_B_Sfield[6]==1'b0)  begin        src2_re   =DP_W_Sactive ;        src2_cross=1'b0;      end else begin         src2_cross=DP_W_Sactive;        src2_re=1'b0;     end  default :begin           src2_re=1'b0;         src2_cross=1'b0;   end   endcase  end   always@( DP_B_Sfield[5] or DP_B_Sfield[3] or DP_B_Sfield[1] or DP_B_Smode[0] or DP_W_Sactive)  begin      if(DP_B_Sfield[5] && !DP_B_Sfield[3] && !DP_B_Sfield[1] && !DP_B_Smode[0])        pre_DC_W_TriSTre=DP_W_Sactive;    else      pre_DC_W_TriSTre=1'b0; end assign I_DC_W_Sinvalid=DP_W_Sactive;   assign DC_W_Ssrc1re=  src1_re;                       //粗译码得到的读使能信号assign DC_W_Ssrc2re=  src2_re;                       //按照当前想法,该信号最先发送到RFassign I_DC_W_TriCrossRE= src2_cross;assign I_DC_W_TriSTre= pre_DC_W_TriSTre;                 wire          DC_W_Ssrc1re_1;wire          DC_W_Ssrc2re_1;wire          I_DC_W_TriCrossRE_1;wire          I_DC_W_TriSTre_1;assign DC_W_Ssrc1re_1=DP_W_Sactive & I_DC_W_Ssrc1re;             //精确译码得到的读使能信号assign DC_W_Ssrc2re_1=DP_W_Sactive & I_DC_W_Ssrc2re;             //这个信号是用来锁存在下一站。是否要将其发送到RF,还需要量化地分析信号产生时机问题。assign I_DC_W_TriCrossRE_1=DP_W_Sactive & I_I_DC_W_TriCrossRE;   // 这个交叉通路读使能是冗余的信号,因为粗译码的对应该信号也是精确信号。assign I_DC_W_TriSTre_1=DP_W_Sactive & I_I_DC_W_TriSTre;assign S_UBranch_Inst= DP_W_Sactive & I_S_UBranch_Inst ;/*always@(DP_W_SBDECBPOS or DP_B_Smode or DP_B_Sfield[0])begin    case(DP_B_Smode)     3'b000:  if(DP_W_SBDECBPOS)                   Dst_use=1'b1;        //必须将下面的dst-use删除掉             else Dst_use=1'b0;    3'b001:       Dst_use=1'b1;    3'b011:  if(DP_B_Sfield[0])                  Dst_use=1'b1;             else Dst_use=1'b0;   default:       Dst_use=1'b0;   endcase                  end*/assign  Dst_use = (DP_udst_Sfield !=3'b000)? 1:0 ;always @(posedge clk)                    //锁存使能信号输出到E1站,用于操作数选择begin  if(stall!=1'b1)  begin     Ssrc1re<=DC_W_Ssrc1re_1;     Ssrc2re<=DC_W_Ssrc2re_1;     DC_W_TriCrossRE<=I_DC_W_TriCrossRE_1;     DC_W_TriSTre<=I_DC_W_TriSTre_1;  end  end always @(DP_B_Sfield or DP_B_Smode or DP_W_Sactive or PDC_con_Value or DC_W_S_SWBP)begin  I_DC_W_U=1'b0;  I_DC_W_SUB2=1'b0;  I_DC_W_SUB=1'b0;  I_DC_W_SSHL=1'b0;  I_DC_W_SHR=1'b0;  I_DC_W_SHL=1'b0;  I_DC_W_SET=1'b0;  I_DC_W_BReg=1'b0;  I_DC_W_OR=1'b0;  I_DC_W_MVKH=1'b0;  I_DC_W_MVC=1'b0;  I_DC_W_EXT=1'b0;  I_DC_W_MVK=1'b0;  I_DC_W_CLR=1'b0;  I_DC_W_BCst=1'b0;  I_DC_W_AND=1'b0;  I_DC_W_ADD2=1'b0;  I_DC_W_ADD=1'b0;  I_DC_W_SADD2  =1'b0;  I_DC_W_SADD  =1'b0;    I_DC_W_SADDU4 =1'b0;  I_DC_W_SADDUS2=1'b0; 	I_DC_W_ADDKPC=1'b0;      I_DC_W_BDEC=1'b0;        I_DC_W_BPOS=1'b0;        I_DC_W_BNOP_Cst=1'b0;    I_DC_W_CMPEQ2=1'b0;      I_DC_W_CMPEQ4=1'b0;      I_DC_W_CMPGT2=1'b0;      I_DC_W_CMPGTU4=1'b0;     I_DC_W_PACKH2=1'b0;      I_DC_W_PACKHL2=1'b0;     I_DC_W_PACKLH2=1'b0;     //I_DC_W_BNOP_Reg=1'b0;    I_DC_W_UNPKHU4=1'b0;     I_DC_W_UNPKLU4=1'b0;     I_DC_W_ANDN=1'b0;        I_DC_W_PACK2=1'b0;       I_DC_W_SHLMB=1'b0;       I_DC_W_SHRMB=1'b0;       I_DC_W_SPACK2=1'b0;      I_DC_W_SPACKU4=1'b0;     I_DC_W_SHR2=1'b0;          I_DC_W_SHRU2=1'b0;         I_DC_W_Src2_Type=1'b0;  I_DC_W_Ssrc1re=1'b0;  I_DC_W_Ssrc2re=1'b0;  I_I_DC_W_TriSTre=1'b0;  I_I_DC_W_TriCrossRE=1'b0;  I_DC_W_XOR=1'b0;  I_DC_W_Condition_Exec=1'b1;  I_DC_W_Scondre=1'b1;  Src1_signed=1'b0;   // Dst_use=1'b0;  I_SUB_RE=1'b0;  Src1_ustab=1'b0;  PCE1_use=1'b0;//  I_S_UBranch_Inst=1'b0; // 10.8  I_DC_W_Src2inv=1'b0; //10.27 gongxiao add    if (DC_W_S_SWBP == 1'b1)begin      case(PDC_con_Value[3:1])  //当条件寄存器信号使能,则在此进行译码选择某一个条件寄存器,同时把条件寄存器地址送出去      3'b001:        //use B0 for condition reg        I_DC_B_Scondaddr=3'b001;              3'b010:        //use B1 for condition reg        I_DC_B_Scondaddr=3'b010;              3'b011:        //use B2 for condition reg        I_DC_B_Scondaddr=3'b011;              3'b100:        //use A1 for condition reg        I_DC_B_Scondaddr=3'b100;           3'b101:        //use A2 for condition reg        I_DC_B_Scondaddr=3'b101;     3'b110:        //use A0 for condition reg        I_DC_B_Scondaddr=3'b110;           default:      //in this path the instruction is unconditional       begin        I_DC_B_Scondaddr=3'b000;        I_DC_W_Condition_Exec=1'b0;        I_DC_W_Scondre=1'b0;      end        endcase  end  else begin            case(DP_B_Sfield[25:23])      3'b001:        //use B0 for condition reg        I_DC_B_Scondaddr=3'b001;              3'b010:        //use B1 for condition reg        I_DC_B_Scondaddr=3'b010;              3'b011:        //use B2 for condition reg        I_DC_B_Scondaddr=3'b011;              3'b100:        //use A1 for condition reg        I_DC_B_Scondaddr=3'b100;           3'b101:        //use A2 for condition reg        I_DC_B_Scondaddr=3'b101;     3'b110:        //use A0 for condition reg        I_DC_B_Scondaddr=3'b110;      default:      //in this path the instruction is unconditional       begin        I_DC_B_Scondaddr=3'b000;        I_DC_W_Condition_Exec=1'b0;        I_DC_W_Scondre=1'b0;      end        endcase   end  if(DP_B_Smode[2:0]==3'b000)  begin    //the basic mode (src1  src2  dst)    case(DP_B_Sfield[5:0])    6'b000111, //ADD instruction    6'b000110: //ADD instruction    begin      //ADD instruction      I_DC_W_ADD=1'b1;      if(DP_B_Sfield[0]==1'b1)      //ADD  src1(sint)  src2(xsint)  dst(sint)        I_DC_W_Ssrc1re=1'b1;      //ADD  src1(cst)  src2(xsint)  dst(sint)      if(DP_B_Sfield[6]==1'b1)        I_I_DC_W_TriCrossRE=1'b1;      else        I_DC_W_Ssrc2re=1'b1;    end        6'b000001: //ADD2 instruction    begin      //ADD2 instruction      I_DC_W_ADD2=1'b1;      I_DC_W_Ssrc1re=1'b1;      //ADD2  src1(sint)  src2(xsint)  dst(sint)      if(DP_B_Sfield[6]==1'b1)        I_I_DC_W_TriCrossRE=1'b1;      else        I_DC_W_Ssrc2re=1'b1;    end    6'b011111, //AND instruction    6'b011110: //AND instruction    begin      //AND instruction      I_DC_W_AND=1'b1;//    I_DC_W_Ssrc1re=1'b1;  //wjh delete it  generate cst      if(DP_B_Sfield[0]==1'b1)        //AND  src1(scst)  src2(xsint)  dst(sint)        I_DC_W_Ssrc1re=1'b1;        //AND  src1(sint)  src2(xsint)  dst(sint)      if(DP_B_Sfield[6]==1'b1)        I_I_DC_W_TriCrossRE=1'b1;      else        I_DC_W_Ssrc2re=1'b1;    end    6'b001101, //B reg   BNOP_reg译码一样,合并 08.1.15    6'b000011: //B creg  B IRP 和 B NRP    begin      I_DC_W_BReg=1'b1; //     I_S_UBranch_Inst=1'b1;// 10.8      if(DP_B_Sfield[1]==1'b1)// B creg        //B  src1(null)  src2(creg)  dst(null)        //the creg read operation is performed in         //E1 stage, the address of creg is transited         //through the source 2 data        I_DC_W_Src2_Type=1'b1;       else                     //B reg      //B  src1(null)  src2(xuint)  dst(null)      //the common reg is read in DC stage      begin        if(DP_B_Sfield[6]==1'b1)          I_I_DC_W_TriCrossRE=1'b1;        else          I_DC_W_Ssrc2re=1'b1;            end    end    6'b100000: //SADD  instruction  10.23 gongxiao add    begin       I_DC_W_SADD=1'b1;      I_DC_W_Ssrc1re=1'b1;      if(DP_B_Sfield[6]==1'b1)        I_I_DC_W_TriCrossRE=1'b1;      else        I_DC_W_Ssrc2re=1'b1;    end         6'b111111, //CLR instruction    6'b101111, //EXT instruction    6'b111011, //SET instruction    6'b101011: //EXTU instruction     begin      if(DP_B_Sfield[4]==1'b1)      begin        if(DP_B_Sfield[2]==1'b1)          //CLR  src1(ucsta,ucstb)  src2(xuint)  dst(uint)          I_DC_W_CLR=1'b1;        else          //SET  src1(ucsta,ucstb)  src2(xuint)  dst(uint)          I_DC_W_SET=1'b1;      end      else      begin        //EXT  src1(ucsta,ucstb)  src2(xsint)  dst(sint)         I_DC_W_EXT=1'b1;        if(DP_B_Sfield[2]==1'b0)          //EXTU  src1(ucsta,ucstb)  src2(xuint)  dst(uint)                    I_DC_W_U=1'b1;      end      I_DC_W_Ssrc1re=1'b1;      if(DP_B_Sfield[6]==1'b1)        I_I_DC_W_TriCrossRE=1'b1;      else        I_DC_W_Ssrc2re=1'b1;          end           6'b001111, //MVC instruction MV creg to dreg    6'b001110: //MVC instruction MV dreg to creg    begin      I_DC_W_MVC=1'b1;      if(DP_B_Sfield[0]==1'b1)        //MVC  src1(null) src2(creg)  dst(dreg)                  I_DC_W_Src2_Type=1'b1;      else      begin        //MVC  src1(null) src2(dreg)  dst(creg)                  if(DP_B_Sfield[6]==1'b1)          I_I_DC_W_TriCrossRE=1'b1;        else          I_DC_W_Ssrc2re=1'b1;            end    end     6'b011011, //OR instruction    6'b011010: //OR instruction    begin      I_DC_W_OR=1'b1;      if(DP_B_Sfield[0]==1'b1)        //MVC  src1(uint) src2(xuint)  dst(uint)                  I_DC_W_Ssrc1re=1'b1;                  //MVC  src1(scst5) src2(xuint)  dst(uint)                if(DP_B_Sfield[6]==1'b1)        I_I_DC_W_TriCrossRE=1'b1;      else        I_DC_W_Ssrc2re=1'b1;                end    6'b110011, //SHL instruction    6'b110010, //SHL instruction    6'b110000, //SHL instruction    6'b110001, //SHL instruction    6'b010011, //SHL instruction    6'b010010: //SHL instruction    begin      I_DC_W_SHL=1'b1;      if(DP_B_Sfield[0]==1'b1)        //src1(uint)           I_DC_W_Ssrc1re=1'b1;      else        //src1(ucst)        Src1_signed=1'b1;      if(DP_B_Sfield[5]==1'b0)              //destination is long        I_DC_W_U=1'b1;      if(DP_B_Sfield[1]==1'b0)            begin        //the source 2 is long data!        I_DC_W_Ssrc2re=1'b1;        I_I_DC_W_TriSTre=1'b1;        I_DC_W_Src2_Type=1'b1;      end      else      begin        //the source 2 is reg data        if(DP_B_Sfield[6]==1'b1)          I_I_DC_W_TriCrossRE=1'b1;        else          I_DC_W_Ssrc2re=1'b1;      end    end    6'b110111, //SHR instruction    6'b110110, //SHR instruction    6'b110101, //SHR instruction    6'b110100, //SHR instruction    6'b100111, //SHRU instruction    6'b100110, //SHRU instruction    6'b100101, //SHRU instruction    6'b100100: //SHRU instruction    begin      I_DC_W_SHR=1'b1;      if(DP_B_Sfield[0]==1'b1)        //src1(uint)           I_DC_W_Ssrc1re=1'b1;      else        //src1(ucst)        Src1_signed=1'b1;      if(DP_B_Sfield[4]==1'b0)            //the operation is usigned SHRU        I_DC_W_U=1'b1;        if(DP_B_Sfield[1]==1'b0)            begin        //the source 2 is long data!        I_DC_W_Ssrc2re=1'b1;        I_I_DC_W_TriSTre=1'b1;        I_DC_W_Src2_Type=1'b1;      end      else      begin        //the source 2 is reg data        if(DP_B_Sfield[6]==1'b1)          I_I_DC_W_TriCrossRE=1'b1;        else          I_DC_W_Ssrc2re=1'b1;      end    end          6'b100011, //SSHL instruction    6'b100010: //SSHL instruction    begin      I_DC_W_SSHL=1'b1;      if(DP_B_Sfield[0]==1'b1)        //src1(uint)           I_DC_W_Ssrc1re=1'b1;      else        //src1(ucst)        Src1_signed=1'b1;      if(DP_B_Sfield[6]==1'b1)        I_I_DC_W_TriCrossRE=1'b1;      else        I_DC_W_Ssrc2re=1'b1;    end    6'b010111, //SUB instruction    6'b010110: //SUB instruction    begin      I_DC_W_Src2inv=1'b1;

⌨️ 快捷键说明

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