RISC-V 实现整数运算指令(Part 2)

 验证R型运算指令

fd21f131489d44d1b69d444c17d64e6f.png

16f3b098ec47479d8a237c50116ae5f9.png

源代码

package alu_defs;

   enum logic [3:0] {
      ADD = 4'b0001,
      SUB = 4'b0010,
      AND = 4'b0011,
      OR  = 4'b0100,
      XOR = 4'b0101,
      SRA = 4'b0110,
      SLL = 4'b0111,
      SRL = 4'b1000
   } aluop;

endpackage


`default_nettype none
// --------------------------------------------------------------------
// CPU 模块
// --------------------------------------------------------------------
module CPU
 #(
     parameter DATAWIDTH = 32,
     parameter ADDRWIDTH = 32
 )
(
    input  wire iCPU_Reset,
    input  wire iCPU_Clk,
    // 指令存储器接口
    output wire [ADDRWIDTH-1:0] oIM_Addr,   //指令存储器地址
    input  wire [DATAWIDTH-1:0] iIM_Data,   //指令存储器数据
    // 数据存储器接口
    input  wire [DATAWIDTH-1:0] iReadData,  //数据存储器读数据
    output wire [DATAWIDTH-1:0] oWriteData, //数据存储器写数据
    output wire [ADDRWIDTH-1:0] oAB,        //数据存储器地址
    output wire oWR,                        //数据存储器写使能
    // 连接调试器的信号
    output wire [ADDRWIDTH-1:0] oCurrent_PC,
    output wire oFetch,
    input  wire iScanClk,
    input  wire iScanIn,
    output wire oScanOut,
    input  wire [1:0] iScanCtrl
);

   /** The input port is replaced with an internal signal **/
   wire   clk   = iCPU_Clk;
   wire   reset = iCPU_Reset;

   // Instruction parts
   //PC
   logic [31:0] pc, nextPC;
   logic [31:0] instruction; // instruction code
   assign nextPC = pc + 4;   /*-TODO 目前仅支持PC+4,增加分支指令时需修改 -*/

   // DataReg
   DataReg #(32) pcreg(.iD(nextPC), .oQ(pc), .Clk(clk), .Reset(reset), .Load(1'b1));
   assign oIM_Addr = pc;         // 连接指令存储器的地址端口
   assign instruction = iIM_Data;// 连接指令存储器的数据端口

   // Instruction decode
   logic [6:0] opcode;
   logic [2:0] funct3;
   logic [6:0] funct7;
   logic [4:0] ra1,ra2,wa;
   assign funct7 = instruction[31:25];
   assign ra2    = instruction[24:20];
   assign ra1    = instruction[19:15];
   assign funct3 = instruction[14:12];
   assign wa     = instruction[11:7];
   assign opcode = instruction[6:0];

   // Control unit
   logic cRegWrite;
   logic [3:0] aluOp;
   logic [4:0] cImm_type;  //{J,U,B,S,I}
   logic immToAlu;
   Controller controller(
      .iOpcode(opcode),
      .iFunct3(funct3),
      .iFunct7(funct7),
      /*-TODO 随着指令的增加,相应添加端口信号 -*/
      .oRegWrite(cRegWrite),
      .oImm_type(cImm_type),
      .oALUop(aluOp),
      .oImmToAlu(immToAlu)
   );

   // Immediate data gener
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈士奇谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值