news 2026/6/30 10:20:24

从零开始设计riscv cpu记录之二

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零开始设计riscv cpu记录之二

目前写的代码,是最简单的基本的思路,后期再慢慢添加控制逻辑,逐步完善。

八、pc_reg.v代码

`include"defines.v"modulepc_reg(input wire clk,input wire rst,input wire jump_i,input wire[AW-1:0]jump_addr_i,input wire stall_i,output reg[AW-1:0]pc_o);always@(posedge clk)beginif(rst==`RstEnable)begin pc_o<=`RstAddr;endelseif(jump_i==`JumpEnable)begin pc_o<=jump_addr_i;endelseif(stall_i==`StallEnable)begin pc_o<=pc_o;endelsebegin pc_o<=pc_o+32'd4;end end endmodule

九、ifetch.v代码

`include"defines.v"moduleifetch(//from pc_reg.vinput[AW-1:0]pc_i,// romoutput[AW-1:0]rom_raddr_o,input[DW-1:0]rom_rdata_i,// to if_id.voutput[DW-1:0]inst_o,output[AW-1:0]inst_addr_o);assign rom_raddr_o=pc_i;assign inst_o=rom_rdata_i;assign inst_addr_o=pc_i;endmodule

十、if_id.v代码

`include"defines.v"moduleif_id(input wire clk,input wire rst,input wire hold_i,input wire flush_i,input wire[DW-1:0]inst_i,input wire[AW-1:0]inst_addr_i,output reg[DW-1:0]inst_o,output reg[AW-1:0]inst_addr_o);always@(posedge clk)beginif(rst==`RstEnable)begin inst_o<=`INST_NOP;inst_addr_o<=`ZeroWord;endelseif(flush_i==`FlushEnable)begin inst_o<=`INST_NOP;inst_addr_o<=`ZeroWord;endelseif(hold_i==`HoldEnable)begin inst_o<=inst_o;inst_addr_o<=inst_addr_o;endelsebegin inst_o<=inst_i;inst_addr_o<=inst_addr_i;end end endmodule

十一、id.v代码

`timescale1ns/1ps `include"defines.v"moduleid(// from if_id.vinput wire[DW-1:0]inst_i,input wire[AW-1:0]inst_addr_i,//regs.voutput reg[4:0]reg1_raddr_o,output reg[4:0]reg2_raddr_o,input wire[DW-1:0]reg1_rdata_i,input wire[DW-1:0]reg2_rdata_i,//to id_ex.voutput reg reg_we_o,output reg[4:0]reg_waddr_o,output reg[DW-1:0]inst_o,output reg[AW-1:0]inst_addr_O,output reg[DW-1:0]op1_o,output reg[DW-1:0]op2_o,output reg[DW-1:0]op1_jump_o,output reg[DW-1:0]op2_jump_o);// inst slicewire[6:0]opcode=inst_i[6:0];wire[4:0]rd=inst_i[11:7];wire[2:0]func3=inst_i[14:12];wire[4:0]rs1=inst_i[19:15];wire[4:0]rs2=inst_i[24:20];wire[6:0]func7=inst_i[31:25];always@(*)begin reg_we_o=`WriteDisable;reg_waddr_o=`ZeroReg;inst_o=inst_i;inst_addr_O=inst_addr_i;op1_o=`ZeroWord;op2_o=`ZeroWord;op1_jump_o=`ZeroWord;op2_jump_o=`ZeroWord;reg1_raddr_o=`ZeroReg;reg2_raddr_o=`ZeroReg;case(opcode)`INST_TYPE_LUI:begin reg_we_o=`WriteEnable;reg_waddr_o=rd;op1_o={inst_i[31:12],12'h0};op2_o=`ZeroWord;end `INST_TYPE_AUIPC:begin reg_we_o=`WriteEnable;reg_waddr_o=rd;op1_o=inst_addr_i;op2_o={inst_i[31:12],12'h0};end `INST_TYPE_JAL:begin reg_we_o=`WriteEnable;reg_waddr_o=rd;op1_o=inst_addr_i;op2_o=32'h4;op1_jump_o=inst_addr_i;op2_jump_o={{12{inst_i[31]}},inst_i[19:12],inst_i[20],inst_i[30:21],1'b0};end `INST_TYPE_JALR:begin reg_we_o=`WriteEnable;reg_waddr_o=rd;reg1_raddr_o=rs1;op1_o=inst_addr_i;op2_o=32'h4;op1_jump_o=reg1_rdata_i;op2_jump_o={{20{inst_i[31]}},inst_i[31:20]};end `INST_TYPE_B:begincase(func3)`INST_BEQ,`INST_BNE,`INST_BLT,`INST_BGE,`INST_BLTU,`INST_BGEU:begin reg1_raddr_o=rs1;reg2_raddr_o=rs2;op1_o=reg1_rdata_i;op2_o=reg2_rdata_i;op1_jump_o=inst_addr_i;op2_jump_o={{20{inst_i[31]}},inst_i[7],inst_i[30:25],inst_i[11:8],1'b0};enddefault:begin end endcase end `INST_TYPE_LOAD:begincase(func3)`INST_LB,`INST_LH,`INST_LW,`INST_LBU,`INST_LHU:begin reg_we_o=`WriteEnable;reg_waddr_o=rd;reg1_raddr_o=rs1;reg2_raddr_o=`ZeroReg;op1_o=reg1_rdata_i;op2_o={{20{inst_i[31]}},inst_i[31:20]};enddefault:begin end endcase end `INST_TYPE_STORE:begincase(func3)`INST_SB,`INST_SH,`INST_SW:begin reg1_raddr_o=rs1;reg2_raddr_o=rs2;op1_o=reg1_rdata_i;op2_o={{20{inst_i[31]}},inst_i[31:25],inst_i[11:7]};enddefault:begin end endcase end `INST_TYPE_I:begincase(func3)`INST_ADDI,`INST_SLTI,`INST_SLTIU,`INST_XORI,`INST_ORI,`INST_ANDI,`INST_SLLI,`INST_SRI:begin reg1_raddr_o=rs1;reg_we_o=`WriteEnable;reg_waddr_o=rd;op1_o=reg1_rdata_i;op2_o={{20{inst_i[31]}},inst_i[31:20]};enddefault:begin end endcase end `INST_TYPE_R_M:beginif(func7==`func7_R||func7==`func7_sub_sra)begincase(func3)`INST_ADD_SUB,`INST_SLL,`INST_SLT,`INST_SLTU,`INST_XOR,`INST_SR,`INST_OR,`INST_AND:begin reg1_raddr_o=rs1;reg2_raddr_o=rs2;reg_we_o=`WriteEnable;reg_waddr_o=rd;op1_o=reg1_rdata_i;op2_o=reg2_rdata_i;enddefault:begin end endcase endelseif(func7==`func7_M)begincase(func3)`INST_MUL,`INST_MULH,`INST_MULHSU,`INST_MULHU:begin reg1_raddr_o=rs1;reg2_raddr_o=rs2;reg_we_o=`WriteEnable;reg_waddr_o=rd;op1_o=reg1_rdata_i;op2_o=reg2_rdata_i;end `INST_DIV,`INST_DIVU,`INST_REM,`INST_REMU:begin reg1_raddr_o=rs1;reg2_raddr_o=rs2;op1_o=reg1_rdata_i;op2_o=reg2_rdata_i;reg_waddr_o=rd;op1_jump_o=inst_addr_i;op2_jump_o=32'h4;enddefault:begin end endcase endelsebegin end end `INST_TYPE_FENCE:begin op1_jump_o=inst_addr_i;op2_jump_o=32'h4;enddefault:begin end endcase end endmodule

十二、id_ex.v代码

`include"defines.v"moduleid_ex(input wire clk,input wire rst,input wire flush_i,input wire stall_i,input wire[DW-1:0]inst_i,input wire[AW-1:0]inst_addr_i,input wire reg_we_i,input wire[4:0]reg_waddr_i,input wire[DW-1:0]op1_i,input wire[DW-1:0]op2_i,input wire[DW-1:0]op1_jump_i,input wire[DW-1:0]op2_jump_i,output reg[DW-1:0]inst_o,output reg[AW-1:0]inst_addr_o,output reg reg_we_o,output reg[4:0]reg_waddr_o,output reg[DW-1:0]op1_o,output reg[DW-1:0]op2_o,output reg[DW-1:0]op1_jump_o,output reg[DW-1:0]op2_jump_o);always@(posedge clk)beginif(rst||flush_i)begin inst_o<=`INST_NOP;inst_addr_o<=`ZeroWord;reg_we_o<=`WriteDisable;reg_waddr_o<=`ZeroReg;op1_o<=`ZeroWord;op2_o<=`ZeroWord;op1_jump_o<=`ZeroWord;op2_jump_o<=`ZeroWord;endelseif(stall_i==`StallEnable)begin inst_o<=inst_o;inst_addr_o<=inst_addr_o;reg_we_o<=reg_we_o;reg_waddr_o<=reg_waddr_o;op1_o<=op1_o;op2_o<=op2_o;op1_jump_o<=op1_jump_o;op2_jump_o<=op2_jump_o;endelsebegin inst_o<=inst_i;inst_addr_o<=inst_addr_i;reg_we_o<=reg_we_i;reg_waddr_o<=reg_waddr_i;op1_o<=op1_i;op2_o<=op2_i;op1_jump_o<=op1_jump_i;op2_jump_o<=op2_jump_i;end end endmodule
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 10:20:16

小白程序员快速上手大模型:MCP协议全面解析(收藏版)

本文深入浅出地介绍了MCP&#xff08;模型上下文协议&#xff09;的概念和作用&#xff0c;旨在帮助小白和程序员快速理解并应用大模型技术。文章首先阐述了MCP解决的关键问题——AI应用如何连接外部工具和数据源&#xff0c;随后详细解析了MCP的工作原理、服务器接入方法以及如…

作者头像 李华
网站建设 2026/6/30 10:19:28

WebFuzzer序列与数据提取器:自动化处理动态文件上传路径

1. 项目概述&#xff1a;从“盲打”到“智能”的WebFuzz进阶在Web安全测试&#xff0c;尤其是渗透测试的漏洞验证阶段&#xff0c;我们常常会遇到一类场景&#xff1a;需要上传一个文件&#xff0c;然后根据服务器的响应&#xff0c;动态地获取这个文件的访问路径&#xff0c;再…

作者头像 李华
网站建设 2026/6/30 10:18:14

python爬虫实战项目|第82篇:爬虫API网关与服务治理

概述 随着爬虫系统规模的扩大,API网关和服务治理变得至关重要。本篇文章将详细介绍爬虫API网关的设计与实现,包括API统一入口、服务注册与发现、负载均衡、限流熔断、安全认证,以及服务治理的核心概念和实践。 1. API网关设计 1.1 网关架构 from typing import Dict, Li…

作者头像 李华
网站建设 2026/6/30 10:15:56

跨厂商GPU编程:OpenCLAW迁移完全指南

## 1. 引言:为什么需要 OpenCLAW? ### 1.1 CUDA 生态的挑战 - NVIDIA GPU 的垄断地位与硬件绑定的问题 - 多厂商 GPU(AMD、Intel、国产芯片)的崛起 - 代码可移植性成为现代高性能计算的刚需 ### 1.2 OpenCLAW 的定位与优势 - OpenCLAW 是什么:跨厂商 GPU 编程框架 - 与 …

作者头像 李华