查看: 1256|回复: 0
收起左侧

E203译码模块(3)

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2021-3-6 15:24:23 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    下面的代码译码出指令的立即数,不同的指令有不同的立即数编码形式。

    1. //I类型指令的imm,[31:20],符号位扩展成32位。

    2. wire [31:0]  rv32_i_imm = {
    3.                                 {20{rv32_instr[31]}}
    4.                                , rv32_instr[31:20]
    5.                               };

    6. //S类型指令的立即数

    7.   wire [31:0]  rv32_s_imm = {
    8.                                 {20{rv32_instr[31]}}
    9.                                , rv32_instr[31:25]
    10.                                , rv32_instr[11:7]
    11.                               };

    12. //B类型指令的立即数
    13.    wire [31:0]  rv32_b_imm = {
    14.                                 {19{rv32_instr[31]}}
    15.                                , rv32_instr[31]
    16.                                , rv32_instr[7]
    17.                                , rv32_instr[30:25]
    18.                                , rv32_instr[11:8]
    19.                                , 1'b0
    20.                                };

    21. //U类型指令立即数

    22.   wire [31:0]  rv32_u_imm = {rv32_instr[31:12],12'b0};

    23. //J类型指令立即数

    24.   wire [31:0]  rv32_j_imm = {
    25.                                 {11{rv32_instr[31]}}
    26.                                , rv32_instr[31]
    27.                                , rv32_instr[19:12]
    28.                                , rv32_instr[20]
    29.                                , rv32_instr[30:21]
    30.                                , 1'b0
    31.                                };

    32.                    // It will select i-type immediate when
    33.                     //    * rv32_op_imm
    34.                     //    * rv32_jalr
    35.                     //    * rv32_load
    36.    wire rv32_imm_sel_i = rv32_op_imm | rv32_jalr | rv32_load;
    37.    wire rv32_imm_sel_jalr = rv32_jalr;
    38.    wire [31:0]  rv32_jalr_imm = rv32_i_imm;

    39.                    // It will select u-type immediate when
    40.                     //    * rv32_lui, rv32_auipc
    41.    wire rv32_imm_sel_u = rv32_lui | rv32_auipc;

    42.                    // It will select j-type immediate when
    43.                     //    * rv32_jal
    44.    wire rv32_imm_sel_j = rv32_jal;
    45.    wire rv32_imm_sel_jal = rv32_jal;
    46.    wire [31:0]  rv32_jal_imm = rv32_j_imm;

    47.                    // It will select b-type immediate when
    48.                     //    * rv32_branch
    49.    wire rv32_imm_sel_b = rv32_branch;
    50.    wire rv32_imm_sel_bxx = rv32_branch;
    51.    wire [31:0]  rv32_bxx_imm = rv32_b_imm;

    52.                     // It will select s-type immediate when
    53.                     //    * rv32_store
    54.    wire rv32_imm_sel_s = rv32_store;
    复制代码
    以下是16位指令的立即数译码,16位指令立即数比较复杂。
    1. //   * Note: this CIS/CILI/CILUI/CI16SP-type is named by myself, because in
    2. //           ISA doc, the CI format for LWSP is different
    3. //           with other CI formats in terms of immediate

    4. // It will select CIS-type immediate when
    5. //    * rv16_lwsp


    6.    wire rv16_imm_sel_cis = rv16_lwsp;
    7.    wire [31:0]  rv16_cis_imm ={
    8.                            24'b0
    9.                          , rv16_instr[3:2]
    10.                          , rv16_instr[12]
    11.                          , rv16_instr[6:4]
    12.                          , 2'b0
    13.                           };

    14.    wire [31:0]  rv16_cis_d_imm ={
    15.                            23'b0
    16.                          , rv16_instr[4:2]
    17.                          , rv16_instr[12]
    18.                          , rv16_instr[6:5]
    19.                          , 3'b0
    20.                           };
    21.                     // It will select CILI-type immediate when
    22.                     //    * rv16_li
    23.                     //    * rv16_addi
    24.                     //    * rv16_slli
    25.                     //    * rv16_srai
    26.                     //    * rv16_srli
    27.                     //    * rv16_andi
    28.    wire rv16_imm_sel_cili = rv16_li | rv16_addi | rv16_slli
    29.                     | rv16_srai | rv16_srli | rv16_andi;
    30.    wire [31:0]  rv16_cili_imm ={
    31.                            {26{rv16_instr[12]}}
    32.                          , rv16_instr[12]
    33.                          , rv16_instr[6:2]
    34.                           };

    35.                     // It will select CILUI-type immediate when
    36.                     //    * rv16_lui
    37.    wire rv16_imm_sel_cilui = rv16_lui;
    38.    wire [31:0]  rv16_cilui_imm ={
    39.                            {14{rv16_instr[12]}}
    40.                          , rv16_instr[12]
    41.                          , rv16_instr[6:2]
    42.                          , 12'b0
    43.                           };

    44.                     // It will select CI16SP-type immediate when
    45.                     //    * rv16_addi16sp
    46.    wire rv16_imm_sel_ci16sp = rv16_addi16sp;
    47.    wire [31:0]  rv16_ci16sp_imm ={
    48.                            {22{rv16_instr[12]}}
    49.                          , rv16_instr[12]
    50.                          , rv16_instr[4]
    51.                          , rv16_instr[3]
    52.                          , rv16_instr[5]
    53.                          , rv16_instr[2]
    54.                          , rv16_instr[6]
    55.                          , 4'b0
    56.                           };

    57.                     // It will select CSS-type immediate when
    58.                     //    * rv16_swsp
    59.    wire rv16_imm_sel_css = rv16_swsp;
    60.    wire [31:0]  rv16_css_imm ={
    61.                            24'b0
    62.                          , rv16_instr[8:7]
    63.                          , rv16_instr[12:9]
    64.                          , 2'b0
    65.                           };
    66.    wire [31:0]  rv16_css_d_imm ={
    67.                            23'b0
    68.                          , rv16_instr[9:7]
    69.                          , rv16_instr[12:10]
    70.                          , 3'b0
    71.                           };
    72.                     // It will select CIW-type immediate when
    73.                     //    * rv16_addi4spn
    74.    wire rv16_imm_sel_ciw = rv16_addi4spn;
    75.    wire [31:0]  rv16_ciw_imm ={
    76.                            22'b0
    77.                          , rv16_instr[10:7]
    78.                          , rv16_instr[12]
    79.                          , rv16_instr[11]
    80.                          , rv16_instr[5]
    81.                          , rv16_instr[6]
    82.                          , 2'b0
    83.                           };

    84.                    // It will select CL-type immediate when
    85.                     //    * rv16_lw
    86.    wire rv16_imm_sel_cl = rv16_lw;
    87.    wire [31:0]  rv16_cl_imm ={
    88.                            25'b0
    89.                          , rv16_instr[5]
    90.                          , rv16_instr[12]
    91.                          , rv16_instr[11]
    92.                          , rv16_instr[10]
    93.                          , rv16_instr[6]
    94.                          , 2'b0
    95.                           };

    96.    wire [31:0]  rv16_cl_d_imm ={
    97.                            24'b0
    98.                          , rv16_instr[6]
    99.                          , rv16_instr[5]
    100.                          , rv16_instr[12]
    101.                          , rv16_instr[11]
    102.                          , rv16_instr[10]
    103.                          , 3'b0
    104.                           };
    105.                     // It will select CS-type immediate when
    106.                     //    * rv16_sw
    107.    wire rv16_imm_sel_cs = rv16_sw;
    108.    wire [31:0]  rv16_cs_imm ={
    109.                            25'b0
    110.                          , rv16_instr[5]
    111.                          , rv16_instr[12]
    112.                          , rv16_instr[11]
    113.                          , rv16_instr[10]
    114.                          , rv16_instr[6]
    115.                          , 2'b0
    116.                           };
    117.     wire [31:0]  rv16_cs_d_imm ={
    118.                            24'b0
    119.                          , rv16_instr[6]
    120.                          , rv16_instr[5]
    121.                          , rv16_instr[12]
    122.                          , rv16_instr[11]
    123.                          , rv16_instr[10]
    124.                          , 3'b0
    125.                           };

    126.                    // It will select CB-type immediate when
    127.                     //    * rv16_beqz
    128.                     //    * rv16_bnez
    129.    wire rv16_imm_sel_cb = rv16_beqz | rv16_bnez;
    130.    wire [31:0]  rv16_cb_imm ={
    131.                            {23{rv16_instr[12]}}
    132.                          , rv16_instr[12]
    133.                          , rv16_instr[6:5]
    134.                          , rv16_instr[2]
    135.                          , rv16_instr[11:10]
    136.                          , rv16_instr[4:3]
    137.                          , 1'b0
    138.                           };
    139.    wire [31:0]  rv16_bxx_imm = rv16_cb_imm;

    140.                    // It will select CJ-type immediate when
    141.                     //    * rv16_j
    142.                     //    * rv16_jal
    143.    wire rv16_imm_sel_cj = rv16_j | rv16_jal;
    144.    wire [31:0]  rv16_cj_imm ={
    145.                            {20{rv16_instr[12]}}
    146.                          , rv16_instr[12]
    147.                          , rv16_instr[8]
    148.                          , rv16_instr[10:9]
    149.                          , rv16_instr[6]
    150.                          , rv16_instr[7]
    151.                          , rv16_instr[2]
    152.                          , rv16_instr[11]
    153.                          , rv16_instr[5:3]
    154.                          , 1'b0
    155.                           };
    156.    wire [31:0]  rv16_jjal_imm = rv16_cj_imm;

    157.                    // It will select CR-type register (no-imm) when
    158.                     //    * rv16_jalr_mv_add
    159.    wire [31:0]  rv16_jrjalr_imm = 32'b0;

    160.                     // It will select CSR-type register (no-imm) when
    161.                     //    * rv16_subxororand
    复制代码
    1. //wire [31:0]  rv32_load_fp_imm  = rv32_i_imm;
    2.    //wire [31:0]  rv32_store_fp_imm = rv32_s_imm;

    3.   //以下代码是通过and or逻辑实现的5路并行多路选择器
    4.    wire [31:0]  rv32_imm =
    5.                       ({32{rv32_imm_sel_i}} & rv32_i_imm)
    6.                     | ({32{rv32_imm_sel_s}} & rv32_s_imm)
    7.                     | ({32{rv32_imm_sel_b}} & rv32_b_imm)
    8.                     | ({32{rv32_imm_sel_u}} & rv32_u_imm)
    9.                     | ({32{rv32_imm_sel_j}} & rv32_j_imm)
    10.                     ;

    11.    wire  rv32_need_imm =
    12.                       rv32_imm_sel_i
    13.                     | rv32_imm_sel_s
    14.                     | rv32_imm_sel_b
    15.                     | rv32_imm_sel_u
    16.                     | rv32_imm_sel_j
    17.                     ;

    18. //以下是10输入并行多路选择器,根据不同的立即数类型,选择生成16位指令的最终立即数。

    19.   wire [31:0]  rv16_imm =
    20.                       ({32{rv16_imm_sel_cis   }} & rv16_cis_imm)
    21.                     | ({32{rv16_imm_sel_cili  }} & rv16_cili_imm)
    22.                     | ({32{rv16_imm_sel_cilui }} & rv16_cilui_imm)
    23.                     | ({32{rv16_imm_sel_ci16sp}} & rv16_ci16sp_imm)
    24.                     | ({32{rv16_imm_sel_css   }} & rv16_css_imm)
    25.                     | ({32{rv16_imm_sel_ciw   }} & rv16_ciw_imm)
    26.                     | ({32{rv16_imm_sel_cl    }} & rv16_cl_imm)
    27.                     | ({32{rv16_imm_sel_cs    }} & rv16_cs_imm)
    28.                     | ({32{rv16_imm_sel_cb    }} & rv16_cb_imm)
    29.                     | ({32{rv16_imm_sel_cj    }} & rv16_cj_imm)
    30.                     ;

    31.   wire rv16_need_imm =
    32.                       rv16_imm_sel_cis
    33.                     | rv16_imm_sel_cili
    34.                     | rv16_imm_sel_cilui
    35.                     | rv16_imm_sel_ci16sp
    36.                     | rv16_imm_sel_css
    37.                     | rv16_imm_sel_ciw
    38.                     | rv16_imm_sel_cl
    39.                     | rv16_imm_sel_cs
    40.                     | rv16_imm_sel_cb
    41.                     | rv16_imm_sel_cj
    42.                     ;


    43.    assign need_imm = rv32 ? rv32_need_imm : rv16_need_imm;

    44.   //根据是rv32还是rv16,产生最终的立即数

    45.   assign dec_imm = rv32 ? rv32_imm : rv16_imm;
    46.    assign dec_pc  = i_pc;



    47. // 根据指令类型,产生最终的信息总线。

    48.   assign dec_info =
    49.                ({`E203_DECINFO_WIDTH{alu_op}}     & {{`E203_DECINFO_WIDTH-`E203_DECINFO_ALU_WIDTH{1'b0}},alu_info_bus})
    50.              | ({`E203_DECINFO_WIDTH{amoldst_op}} & {{`E203_DECINFO_WIDTH-`E203_DECINFO_AGU_WIDTH{1'b0}},agu_info_bus})
    51.              | ({`E203_DECINFO_WIDTH{bjp_op}}     & {{`E203_DECINFO_WIDTH-`E203_DECINFO_BJP_WIDTH{1'b0}},bjp_info_bus})
    52.              | ({`E203_DECINFO_WIDTH{csr_op}}     & {{`E203_DECINFO_WIDTH-`E203_DECINFO_CSR_WIDTH{1'b0}},csr_info_bus})
    53.              | ({`E203_DECINFO_WIDTH{muldiv_op}}  & {{`E203_DECINFO_WIDTH-`E203_DECINFO_CSR_WIDTH{1'b0}},muldiv_info_bus})
    54.                ;


    55.    wire legl_ops =
    56.                alu_op
    57.              | amoldst_op
    58.              | bjp_op
    59.              | csr_op
    60.              | muldiv_op
    61.              ;
    复制代码
    解码16位指令的寄存器。
    1. // To decode the registers for Rv16, divided into 8 groups
    2.    wire rv16_format_cr  = rv16_jalr_mv_add;
    3.    wire rv16_format_ci  = rv16_lwsp | rv16_flwsp | rv16_fldsp | rv16_li | rv16_lui_addi16sp | rv16_addi | rv16_slli;
    4.    wire rv16_format_css = rv16_swsp | rv16_fswsp | rv16_fsdsp;
    5.    wire rv16_format_ciw = rv16_addi4spn;
    6.    wire rv16_format_cl  = rv16_lw | rv16_flw | rv16_fld;
    7.    wire rv16_format_cs  = rv16_sw | rv16_fsw | rv16_fsd | rv16_subxororand;
    8.    wire rv16_format_cb  = rv16_beqz | rv16_bnez | rv16_srli | rv16_srai | rv16_andi;
    9.    wire rv16_format_cj  = rv16_j | rv16_jal;


    10.    // In CR Cases:
    11.    //   * JR:     rs1= rs1(coded),     rs2= x0 (coded),   rd = x0 (implicit)
    12.    //   * JALR:   rs1= rs1(coded),     rs2= x0 (coded),   rd = x1 (implicit)
    13.    //   * MV:     rs1= x0 (implicit),  rs2= rs2(coded),   rd = rd (coded)
    14.    //   * ADD:    rs1= rs1(coded),     rs2= rs2(coded),   rd = rd (coded)
    15.    //   * eBreak: rs1= rs1(coded),     rs2= x0 (coded),   rd = x0 (coded)
    16.    wire rv16_need_cr_rs1   = rv16_format_cr & 1'b1;
    17.    wire rv16_need_cr_rs2   = rv16_format_cr & 1'b1;
    18.    wire rv16_need_cr_rd    = rv16_format_cr & 1'b1;
    19.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cr_rs1 = rv16_mv ? `E203_RFIDX_WIDTH'd0 : rv16_rs1[`E203_RFIDX_WIDTH-1:0];
    20.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cr_rs2 = rv16_rs2[`E203_RFIDX_WIDTH-1:0];
    21.       // The JALR and JR difference in encoding is just the rv16_instr[12]
    22.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cr_rd  = (rv16_jalr | rv16_jr)?
    23.                   {{`E203_RFIDX_WIDTH-1{1'b0}},rv16_instr[12]} : rv16_rd[`E203_RFIDX_WIDTH-1:0];

    24.    // In CI Cases:
    25.    //   * LWSP:     rs1= x2 (implicit),  rd = rd
    26.    //   * LI/LUI:   rs1= x0 (implicit),  rd = rd
    27.    //   * ADDI:     rs1= rs1(implicit),  rd = rd
    28.    //   * ADDI16SP: rs1= rs1(implicit),  rd = rd
    29.    //   * SLLI:     rs1= rs1(implicit),  rd = rd
    30.    wire rv16_need_ci_rs1   = rv16_format_ci & 1'b1;
    31.    wire rv16_need_ci_rs2   = rv16_format_ci & 1'b0;
    32.    wire rv16_need_ci_rd    = rv16_format_ci & 1'b1;
    33.    wire [`E203_RFIDX_WIDTH-1:0] rv16_ci_rs1 = (rv16_lwsp | rv16_flwsp | rv16_fldsp) ? `E203_RFIDX_WIDTH'd2 :
    34.                                    (rv16_li | rv16_lui) ? `E203_RFIDX_WIDTH'd0 : rv16_rs1[`E203_RFIDX_WIDTH-1:0];
    35.    wire [`E203_RFIDX_WIDTH-1:0] rv16_ci_rs2 = `E203_RFIDX_WIDTH'd0;
    36.    wire [`E203_RFIDX_WIDTH-1:0] rv16_ci_rd  = rv16_rd[`E203_RFIDX_WIDTH-1:0];

    37.    // In CSS Cases:
    38.    //   * SWSP:     rs1 = x2 (implicit), rs2= rs2
    39.    wire rv16_need_css_rs1  = rv16_format_css & 1'b1;
    40.    wire rv16_need_css_rs2  = rv16_format_css & 1'b1;
    41.    wire rv16_need_css_rd   = rv16_format_css & 1'b0;
    42.    wire [`E203_RFIDX_WIDTH-1:0] rv16_css_rs1 = `E203_RFIDX_WIDTH'd2;
    43.    wire [`E203_RFIDX_WIDTH-1:0] rv16_css_rs2 = rv16_rs2[`E203_RFIDX_WIDTH-1:0];
    44.    wire [`E203_RFIDX_WIDTH-1:0] rv16_css_rd  = `E203_RFIDX_WIDTH'd0;

    45.    // In CIW cases:
    46.    //   * ADDI4SPN:   rdd = rdd, rss1= x2 (implicit)
    47.    wire rv16_need_ciw_rss1 = rv16_format_ciw & 1'b1;
    48.    wire rv16_need_ciw_rss2 = rv16_format_ciw & 1'b0;
    49.    wire rv16_need_ciw_rdd  = rv16_format_ciw & 1'b1;
    50.    wire [`E203_RFIDX_WIDTH-1:0] rv16_ciw_rss1  = `E203_RFIDX_WIDTH'd2;
    51.    wire [`E203_RFIDX_WIDTH-1:0] rv16_ciw_rss2  = `E203_RFIDX_WIDTH'd0;
    52.    wire [`E203_RFIDX_WIDTH-1:0] rv16_ciw_rdd  = rv16_rdd[`E203_RFIDX_WIDTH-1:0];

    53.    // In CL cases:
    54.    //   * LW:   rss1 = rss1, rdd= rdd
    55.    wire rv16_need_cl_rss1  = rv16_format_cl & 1'b1;
    56.    wire rv16_need_cl_rss2  = rv16_format_cl & 1'b0;
    57.    wire rv16_need_cl_rdd   = rv16_format_cl & 1'b1;
    58.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cl_rss1 = rv16_rss1[`E203_RFIDX_WIDTH-1:0];
    59.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cl_rss2 = `E203_RFIDX_WIDTH'd0;
    60.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cl_rdd  = rv16_rdd[`E203_RFIDX_WIDTH-1:0];

    61.    // In CS cases:
    62.    //   * SW:            rdd = none(implicit), rss1= rss1       , rss2=rss2
    63.    //   * SUBXORORAND:   rdd = rss1,           rss1= rss1(coded), rss2=rss2
    64.    wire rv16_need_cs_rss1  = rv16_format_cs & 1'b1;
    65.    wire rv16_need_cs_rss2  = rv16_format_cs & 1'b1;
    66.    wire rv16_need_cs_rdd   = rv16_format_cs & rv16_subxororand;
    67.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cs_rss1 = rv16_rss1[`E203_RFIDX_WIDTH-1:0];
    68.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cs_rss2 = rv16_rss2[`E203_RFIDX_WIDTH-1:0];
    69.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cs_rdd  = rv16_rss1[`E203_RFIDX_WIDTH-1:0];

    70.    // In CB cases:
    71.    //   * BEQ/BNE:            rdd = none(implicit), rss1= rss1, rss2=x0(implicit)
    72.    //   * SRLI/SRAI/ANDI:     rdd = rss1          , rss1= rss1, rss2=none(implicit)
    73.    wire rv16_need_cb_rss1  = rv16_format_cb & 1'b1;
    74.    wire rv16_need_cb_rss2  = rv16_format_cb & (rv16_beqz | rv16_bnez);
    75.    wire rv16_need_cb_rdd   = rv16_format_cb & (~(rv16_beqz | rv16_bnez));
    76.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cb_rss1 = rv16_rss1[`E203_RFIDX_WIDTH-1:0];
    77.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cb_rss2 = `E203_RFIDX_WIDTH'd0;
    78.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cb_rdd  = rv16_rss1[`E203_RFIDX_WIDTH-1:0];

    79.    // In CJ cases:
    80.    //   * J:            rdd = x0(implicit)
    81.    //   * JAL:          rdd = x1(implicit)
    82.    wire rv16_need_cj_rss1  = rv16_format_cj & 1'b0;
    83.    wire rv16_need_cj_rss2  = rv16_format_cj & 1'b0;
    84.    wire rv16_need_cj_rdd   = rv16_format_cj & 1'b1;
    85.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cj_rss1 = `E203_RFIDX_WIDTH'd0;
    86.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cj_rss2 = `E203_RFIDX_WIDTH'd0;
    87.    wire [`E203_RFIDX_WIDTH-1:0] rv16_cj_rdd  = rv16_j ? `E203_RFIDX_WIDTH'd0 : `E203_RFIDX_WIDTH'd1;

    88.   // rv16_format_cr  
    89.    // rv16_format_ci  
    90.    // rv16_format_css
    91.    // rv16_format_ciw
    92.    // rv16_format_cl  
    93.    // rv16_format_cs  
    94.    // rv16_format_cb  
    95.    // rv16_format_cj  
    96.    wire rv16_need_rs1 = rv16_need_cr_rs1 | rv16_need_ci_rs1 | rv16_need_css_rs1;
    97.    wire rv16_need_rs2 = rv16_need_cr_rs2 | rv16_need_ci_rs2 | rv16_need_css_rs2;
    98.    wire rv16_need_rd  = rv16_need_cr_rd  | rv16_need_ci_rd  | rv16_need_css_rd;

    99.   wire rv16_need_rss1 = rv16_need_ciw_rss1|rv16_need_cl_rss1|rv16_need_cs_rss1|rv16_need_cb_rss1|rv16_need_cj_rss1;
    100.    wire rv16_need_rss2 = rv16_need_ciw_rss2|rv16_need_cl_rss2|rv16_need_cs_rss2|rv16_need_cb_rss2|rv16_need_cj_rss2;
    101.    wire rv16_need_rdd  = rv16_need_ciw_rdd |rv16_need_cl_rdd |rv16_need_cs_rdd |rv16_need_cb_rdd |rv16_need_cj_rdd ;

    102.   wire rv16_rs1en = (rv16_need_rs1 | rv16_need_rss1);
    103.    wire rv16_rs2en = (rv16_need_rs2 | rv16_need_rss2);
    104.    wire rv16_rden  = (rv16_need_rd  | rv16_need_rdd );

    105.   wire [`E203_RFIDX_WIDTH-1:0] rv16_rs1idx;
    106.    wire [`E203_RFIDX_WIDTH-1:0] rv16_rs2idx;
    107.    wire [`E203_RFIDX_WIDTH-1:0] rv16_rdidx ;

    108.   assign rv16_rs1idx =
    109.           ({`E203_RFIDX_WIDTH{rv16_need_cr_rs1 }} & rv16_cr_rs1)
    110.         | ({`E203_RFIDX_WIDTH{rv16_need_ci_rs1 }} & rv16_ci_rs1)
    111.         | ({`E203_RFIDX_WIDTH{rv16_need_css_rs1}} & rv16_css_rs1)
    112.         | ({`E203_RFIDX_WIDTH{rv16_need_ciw_rss1}} & rv16_ciw_rss1)
    113.         | ({`E203_RFIDX_WIDTH{rv16_need_cl_rss1}}  & rv16_cl_rss1)
    114.         | ({`E203_RFIDX_WIDTH{rv16_need_cs_rss1}}  & rv16_cs_rss1)
    115.         | ({`E203_RFIDX_WIDTH{rv16_need_cb_rss1}}  & rv16_cb_rss1)
    116.         | ({`E203_RFIDX_WIDTH{rv16_need_cj_rss1}}  & rv16_cj_rss1)
    117.         ;

    118.   assign rv16_rs2idx =
    119.           ({`E203_RFIDX_WIDTH{rv16_need_cr_rs2 }} & rv16_cr_rs2)
    120.         | ({`E203_RFIDX_WIDTH{rv16_need_ci_rs2 }} & rv16_ci_rs2)
    121.         | ({`E203_RFIDX_WIDTH{rv16_need_css_rs2}} & rv16_css_rs2)
    122.         | ({`E203_RFIDX_WIDTH{rv16_need_ciw_rss2}} & rv16_ciw_rss2)
    123.         | ({`E203_RFIDX_WIDTH{rv16_need_cl_rss2}}  & rv16_cl_rss2)
    124.         | ({`E203_RFIDX_WIDTH{rv16_need_cs_rss2}}  & rv16_cs_rss2)
    125.         | ({`E203_RFIDX_WIDTH{rv16_need_cb_rss2}}  & rv16_cb_rss2)
    126.         | ({`E203_RFIDX_WIDTH{rv16_need_cj_rss2}}  & rv16_cj_rss2)
    127.         ;

    128.   assign rv16_rdidx =
    129.           ({`E203_RFIDX_WIDTH{rv16_need_cr_rd }} & rv16_cr_rd)
    130.         | ({`E203_RFIDX_WIDTH{rv16_need_ci_rd }} & rv16_ci_rd)
    131.         | ({`E203_RFIDX_WIDTH{rv16_need_css_rd}} & rv16_css_rd)
    132.         | ({`E203_RFIDX_WIDTH{rv16_need_ciw_rdd}} & rv16_ciw_rdd)
    133.         | ({`E203_RFIDX_WIDTH{rv16_need_cl_rdd}}  & rv16_cl_rdd)
    134.         | ({`E203_RFIDX_WIDTH{rv16_need_cs_rdd}}  & rv16_cs_rdd)
    135.         | ({`E203_RFIDX_WIDTH{rv16_need_cb_rdd}}  & rv16_cb_rdd)
    136.         | ({`E203_RFIDX_WIDTH{rv16_need_cj_rdd}}  & rv16_cj_rdd)
    137.         ;

    138.   assign dec_rs1idx = rv32 ? rv32_rs1[`E203_RFIDX_WIDTH-1:0] : rv16_rs1idx;
    139.    assign dec_rs2idx = rv32 ? rv32_rs2[`E203_RFIDX_WIDTH-1:0] : rv16_rs2idx;
    140.    assign dec_rdidx  = rv32 ? rv32_rd [`E203_RFIDX_WIDTH-1:0] : rv16_rdidx ;


    141.    assign dec_rs1en = rv32 ? rv32_need_rs1 : (rv16_rs1en & (~(rv16_rs1idx == `E203_RFIDX_WIDTH'b0)));
    142.    assign dec_rs2en = rv32 ? rv32_need_rs2 : (rv16_rs2en & (~(rv16_rs2idx == `E203_RFIDX_WIDTH'b0)));
    143.    assign dec_rdwen = rv32 ? rv32_need_rd  : (rv16_rden  & (~(rv16_rdidx  == `E203_RFIDX_WIDTH'b0)));

    144.   assign dec_rs1x0 = (dec_rs1idx == `E203_RFIDX_WIDTH'b0);
    145.    assign dec_rs2x0 = (dec_rs2idx == `E203_RFIDX_WIDTH'b0);

    146.    wire rv_index_ilgl;
    147.    `ifdef E203_RFREG_NUM_IS_4 //{
    148.    assign rv_index_ilgl =
    149.                   (| dec_rs1idx[`E203_RFIDX_WIDTH-1:2])
    150.                  |(| dec_rs2idx[`E203_RFIDX_WIDTH-1:2])
    151.                  |(| dec_rdidx [`E203_RFIDX_WIDTH-1:2])
    152.                  ;
    153.    `endif//}
    154.    `ifdef E203_RFREG_NUM_IS_8 //{
    155.    assign rv_index_ilgl =
    156.                   (| dec_rs1idx[`E203_RFIDX_WIDTH-1:3])
    157.                  |(| dec_rs2idx[`E203_RFIDX_WIDTH-1:3])
    158.                  |(| dec_rdidx [`E203_RFIDX_WIDTH-1:3])
    159.                  ;
    160.    `endif//}
    161.    `ifdef E203_RFREG_NUM_IS_16 //{
    162.    assign rv_index_ilgl =
    163.                   (| dec_rs1idx[`E203_RFIDX_WIDTH-1:4])
    164.                  |(| dec_rs2idx[`E203_RFIDX_WIDTH-1:4])
    165.                  |(| dec_rdidx [`E203_RFIDX_WIDTH-1:4])
    166.                  ;
    167.    `endif//}
    168.    `ifdef E203_RFREG_NUM_IS_32 //{
    169.        //Never happen this illegal exception
    170.    assign rv_index_ilgl = 1'b0;
    171.    `endif//}

    172.   assign dec_rv32 = rv32;

    173.   assign dec_bjp_imm =
    174.                       ({32{rv16_jal | rv16_j     }} & rv16_jjal_imm)
    175.                     | ({32{rv16_jalr_mv_add      }} & rv16_jrjalr_imm)
    176.                     | ({32{rv16_beqz | rv16_bnez }} & rv16_bxx_imm)
    177.                     | ({32{rv32_jal              }} & rv32_jal_imm)
    178.                     | ({32{rv32_jalr             }} & rv32_jalr_imm)
    179.                     | ({32{rv32_branch           }} & rv32_bxx_imm)
    180.                     ;

    181.   assign dec_jalr_rs1idx = rv32 ? rv32_rs1[`E203_RFIDX_WIDTH-1:0] : rv16_rs1[`E203_RFIDX_WIDTH-1:0];

    182.   assign dec_misalgn = i_misalgn;
    183.    assign dec_buserr  = i_buserr ;


    184.    assign dec_ilegl =
    185.              (rv_all0s1s_ilgl)
    186.            | (rv_index_ilgl)
    187.            | (rv16_addi16sp_ilgl)
    188.            | (rv16_addi4spn_ilgl)
    189.            | (rv16_li_lui_ilgl)
    190.            | (rv16_sxxi_shamt_ilgl)
    191.            | (rv32_sxxi_shamt_ilgl)
    192.            | (rv32_dret_ilgl)
    193.            | (rv16_lwsp_ilgl)
    194.            | (~legl_ops);
    复制代码







    上一篇:E203 译码模块(2)
    下一篇:RVZicsr指令集
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-24 23:43 , Processed in 0.815354 second(s), 45 queries .

    快速回复 返回顶部 返回列表