E203 蜂鸟 RISC-V处理器代码阅读笔记 之指令预取模块1(指令微译码) e203_ifu_minidec.v

这个文章记录了我学习RISC-V蜂鸟E203处理器的学习历程
这是我正式阅读代码学习的第2个源代码文件

针对代码的学习,我结合自己的理解对每个module的接口,以及内部关键信号做了详细的注释说明
原创不易,请保护版权,转载联系作者,并请注明出处,标出原始链接谢谢~~
e203_ifu_minidec.v

/*                                                                      
 Copyright 2017 Silicon Integrated Microelectronics, Inc.                
                                                                         
 Licensed under the Apache License, Version 2.0 (the "License");         
 you may not use this file except in compliance with the License.        
 You may obtain a copy of the License at                                 
                                                                         
     http://www.apache.org/licenses/LICENSE-2.0                          
                                                                         
  Unless required by applicable law or agreed to in writing, software    
 distributed under the License is distributed on an "AS IS" BASIS,       
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and     
 limitations under the License.                                          
 */                                                                      
                                                                         
                                                                         
                                                                         
//=====================================================================
//--        _______   ___
//--       (   ____/ /__/
//--        \ \     __
//--     ____\ \   / /
//--    /_______\ /_/   MICROELECTRONICS
//--
//=====================================================================
// Designer   : Bob Hu
//
// Description:
//  The mini-decode module to decode the instruction in IFU 
//
// ====================================================================
// ========== 我自己的一些注释说明
// 这个模块就是例化了一下exu_decode模块的一部分,取出来关于跳转指令的相关信息,根据
// 这些信息判断当前指令预取的时候是否需要进行PC跳转
// ==========
`include "e203_defines.v"

module e203_ifu_minidec(

  //
  // The IR stage to Decoder
  input  [`E203_INSTR_SIZE-1:0] instr, //取指逻辑取回的指令,作为输入等待译码
  
  //
  // The Decoded Info-Bus


  output dec_rs1en, //解码判断reg-source1是否有效,一条指令的原操作数1和2
  output dec_rs2en, //解码判断reg-source2是否有效
  output [`E203_RFIDX_WIDTH-1:0] dec_rs1idx, //这里返回的是原操作数寄存器在寄存器列表文件中的地址
  output [`E203_RFIDX_WIDTH-1:0] dec_rs2idx, //也就是说cpu中的寄存器单独编址(即cpu内部总线,独立于系统总线)成一个文件
                                             //这里的index就是原操作数寄存器在cpu内部总线上的地址
  output dec_mulhsu, // mul-high-signed-unsigned rs1有符号,rs2无符号,相乘结果(64bit)的高32bit放入rd
  output dec_mul   , // mul rs1无符号,rs2无符号,(有符号无符号其实是一样的)相乘结果(64bit)的低32bit放入rd
  output dec_div   , // div rs1有符号,rs2有符号
  output dec_rem   , // 取  rs1有符号与rs2有符号数,取余数送到dr;
  output dec_divu  , // 无符号取商送dr
  output dec_remu  , // 无符号取余送dr

  output dec_rv32, //表示当前指令是rsic-v32位指令,还是16位指令
  output dec_bjp,  //表示当前指令是普通指令还是分支跳转指令,表示是否属于bxx指令或jxx指令的一种
  output dec_jal,  //属于jal指令
  output dec_jalr, //数据jalr指令
  output dec_bxx,  //属于BXX指令,(BEQ,BNE等带条件分支指令)
  output [`E203_RFIDX_WIDTH-1:0] dec_jalr_rs1idx, //针对jalr指令,其首先要取出rs1操作数,然后与立即数相加才能得到值+4作为新的pc,为了取rs1,指令里带了rs1的地址(cpu内部index)
  output [`E203_XLEN-1:0] dec_bjp_imm             //针对bxx指令,如果条件满足的话,会把12bit立即数(有符号)×2然后与pc相加,作为新的pc;这里是译码出的指令的立即数 

  );

  e203_exu_decode u_e203_exu_decode(  // 关于exu_decode 模块,这些接口信号我都在e203_exu_decode.v里做了注释

  .i_instr(instr),
  .i_pc(`E203_PC_SIZE'b0),
  .i_prdt_taken(1'b0), 
  .i_muldiv_b2b(1'b0), 

  .i_misalgn (1'b0),
  .i_buserr  (1'b0),

  .dbg_mode  (1'b0),

  .dec_misalgn(),
  .dec_buserr(),
  .dec_ilegl(),

  .dec_rs1x0(),
  .dec_rs2x0(),
  .dec_rs1en(dec_rs1en), //  
  .dec_rs2en(dec_rs2en), // 
  .dec_rdwen(),
  .dec_rs1idx(dec_rs1idx),
  .dec_rs2idx(dec_rs2idx),
  .dec_rdidx(),
  .dec_info(),  
  .dec_imm(),
  .dec_pc(),

  
  .dec_mulhsu(dec_mulhsu),
  .dec_mul   (dec_mul   ),
  .dec_div   (dec_div   ),
  .dec_rem   (dec_rem   ),
  .dec_divu  (dec_divu  ),
  .dec_remu  (dec_remu  ),

  .dec_rv32(dec_rv32),
  .dec_bjp (dec_bjp ),
  .dec_jal (dec_jal ),
  .dec_jalr(dec_jalr),
  .dec_bxx (dec_bxx ),

  .dec_jalr_rs1idx(dec_jalr_rs1idx),
  .dec_bjp_imm    (dec_bjp_imm    )  
  );


endmodule

你可能感兴趣的:(数字IC前端,cpu设计,verilog)