通用寄存器

这篇学习笔记详细介绍了RISC-V处理器的32个通用寄存器,包括只读寄存器x0。寄存器的读写操作涉及执行模块和JTAG模块,其中读操作由译码模块发起,写操作由执行模块和JTAG模块完成。寄存器的读写信号包括时钟、复位、写使能等。读取时,如果地址为x0则返回0,其他情况返回对应寄存器值。
摘要由CSDN通过智能技术生成

注意:学习笔记,参考《从零开始写RISC-V处理器》

一共有32个通用寄存器x0~x31,其中寄存器x0是只读寄存器并且其值固定为0。

通用寄存器的输入输出信号如下表所示:

序号信号名输入/输出位宽(bits)说明
1clk输入1时钟输入
2rst输入1复位输入
3we_i输入1来自执行模块的写使能
4waddr_i输入5来自执行模块的写地址
5wdata_i输入32来自执行模块的写数据
6jtag_we_i输入1来自jtag模块的写使能
7jtag_addr_i输入5来自jtag模块的写地址
8jtag_data_i输入32来自jtag模块的写数据
9raddr1_i输入5来自译码模块的寄存器1读地址
10rdata1_o输出32寄存器1读数据
11raddr2_i输入5来自译码模块的寄存器2读地址
12rdata2_o输出32寄存器2读数据
13jtag_data_o输出32jtag读数据

 注意,这里的寄存器1不是指x1寄存器,寄存器2也不是指x2寄存器。而是指一条指令里涉及到的两个寄存器(源寄存器1和源寄存器2)。一条指令可能会同时读取两个寄存器的值,所以有两个读端口。又因为jtag模块也会进行寄存器的读操作,所以一共有三个读端口。

读寄存器操作来自译码模块,并且读出来的寄存器数据也会返回给译码模块。写寄存器操作来自执行模块。

// 读寄存器1
always @ (*) begin
    if (rst == `RstEnable) begin
        rdata1_o = `ZeroWord;
    end else if (raddr1_i == `RegNumLog2'h0) begin//如果是读寄存器0(x0),那么直接返回0就可以
        rdata1_o = `ZeroWord;
    // 如果读地址等于写地址,并且正在写操作,则直接返回写数据
    end else if (raddr1_i == waddr_i && we_i == `WriteEnable) begin
        rdata1_o = wdata_i;
    end else begin
        rdata1_o = regs[raddr1_i];
    end
// 写寄存器
always @ (posedge clk) begin
    if (rst == `RstDisable) begin
        // 优先ex模块写操作
        if ((we_i == `WriteEnable) && (waddr_i != `RegNumLog2'h0)) begin
//如果执行模块写使能并且要写的寄存器不是x0寄存器
            regs[waddr_i] <= wdata_i;
        end else if ((jtag_we_i == `WriteEnable) && (jtag_addr_i != `RegNumLog2'h0)) begin
//jtag模块的写操作
            regs[jtag_addr_i] <= jtag_data_i;
        end
    end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值