设计npc、为npc搭建基础设施

一、NPC设计的基本思路

  • 目前使用verilog编写npc,它的底层描述更为清晰,细节掌握更为具体。
  • 采用模块化的设计,方便将来设计流水线,将指令存储器与数据存储器分开(但是在pmem中它们同属于一个数组中,Am采用linker.ld脚本将数据与指令的位置隔离开,这样我们在设计时就不需要考虑冲突的问题)。
  • 对于控制信号的设计,采用了CPU设计实战对于loongarch指令译码出控制信号的设计思路(避免了case语句代码的重复性以及采用真值表设计的复杂性)。

电路图如下:

控制信号译码模块代码:

`include "Define.v"

module ID(

    input wire [`DataBus-1:0] Inst,

    input wire [`DataBus-1:0] Pc,

    output wire [`RegAddr-1:0] Raddr1,
    input wire [`DataBus-1:0] BusA,

    output wire [`RegAddr-1:0] Raddr2,
    input wire [`DataBus-1:0] BusB,

    output wire [`DataBus-1:0] Src1,
    output wire [`DataBus-1:0] Src2,

    output wire Reg_Wr,
    output wire [`RegAddr-1:0] Reg_Waddr,

    output wire Mem_Wr,
    output wire [`MemAddr-1:0] Mem_Wdata,

    output wire [`Ctrl_Alu_Ctrl-1:0] Alu_Ctrl,
    output wire Mem_To_Reg,
    output wire Next_Pc_To_Reg,
    output wire Jal_Jump,
    output wire Jalr_Jump,

    output wire [`DataBus-1:0] Imm

);

    wire Alu_Asrc_Is_Pc;
    wire Alu_Bsrc_Is_Imm;
    wire Alu_Bsrc_Is_4;

    wire [`OpBus-1:0] op;
    wire [`Funct3-1:0] funct3;
    wire [`Funct7-1:0] funct7;
    wire [`RegAddr-1:0] rs1, rs2, rd;

    assign op = Inst[6:0];
    assign funct3 = Inst[14:12];
    assign funct7 = Inst[31:25];
    assign rs1 = Inst[19:15];
    assign rs2 = Inst[24:20];
    assign rd = Inst[11:7];

    Ctrl ctrl(
        .Inst(Inst),
        .op(op),
       .funct3(funct3),
       .funct7(funct7),
       .Alu_Asrc_Is_Pc(Alu_Asrc_Is_Pc),
       .Alu_Bsrc_Is_Imm(Al
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值