2023北航计组p4课下部分

P4课下

写在开始前

万里长征已过一半,同志们继续努力!

关于比较具体的理论分析,请看我的另一篇博客P3课下。本博客只讲解从P3升级到P4过程中需要注意的内容。

P4要求用verilog实现P3中搭建的单周期cpu。整体上来说就是一个翻译的过程,但是因为毕竟用的载体不一样,还是存在一些需要修改的地方。

在开始编写代码前,千万要确定好自己的代码风格和编写规范,这很重要,能避免很多问题。

P4课上已更新,见我另一篇博客。

开发流程

建议先写好模块,在写顶层电路,将模块按照logisim或课本上的电路图进行连接,这样可以避免很多错误。

设计规范举例

模块

我的做法是给每个实例化的模块都定义好针对该模块的接线,然后再慢慢连接。如下所示:

wire rst_DM;
wire clk_DM;
wire WE_DM;
wire[31:0] A_DM;
wire[31:0] WD_DM;
wire[31:0] RD_DM;
DM _DM(reset,clk,WE_DM,PC_IFU,A_DM,WD_DM,RD_DM);//DM
//需要注意的是,这里无论output的规格是reg还是wire,外部的接线都得定义为wire

//*********************************************
//DM init

assign A_DM=ALUResult_ALU;
assign WD_DM=AD2_GRF;
assign WE_DM=MemWrite_Controller;

这么做的好处很明显,就是规范和工整,方便纠错。但坏处也很明显,就是代码量会很容易膨胀的特别大。

而所有在顶层电路中出现的多路选择器,我在给每个模块的输入连线的时候实现它们的功能。

需要注意的是,P4可能会增添一些P3没有的指令,这时候要想好新增逻辑是否会造成什么别的影响。

控制信号

我的做法是针对每个func和op,直接给出对应的控制信号,如下:

if(Func==6'b100000)//add
		begin
			nop=1'b0;
			RegWrite=1'b1;
			RegDst=1'b1;
			ALUSrc=1'b0;
			Branch=1'b0;
			MemWrite=1'b0;
			MemtoReg=1'b0;
			ALUControl=3'b000;
			ExtControl=1'b1;
			LinkLable=1'b0;
			JrLable=1'b0;
		end

好处是简单而且直白,不会给以后的开发增添思维负担。坏处是代码很容易过长。不过controller是封装好的模块,只要能在课下保证controller是正确的那代码过长的问题也影响不大。

控制信号约定

参数含义
RegWrite是否要写入寄存器文件
RegDst决定存放被写入寄存器的地址为哪几位,0为I型指令,1为R型
ALUSrc决定ALU的第二个数据是立即数还是寄存器的值。0为寄存器
Branch决定当前是否为分支指令,1为是
MemWrite决定是否要写入数据存储器,1为是
MemtoReg所需结果是ALU计算结果还是读取结果,0为计算
ALUOpALU的操作指令
ExtControl决定扩展是符号扩展还是0扩展,1为符号,0为0
LinkLable是否要将PC+4写入31号寄存器,1是 是
JrLable是否从寄存器跳转,1是
linklable>RegDst
————————————
Branch>JrLable>LinkLable//这部分是在判断输入时信号的先后顺序
指令RegWriteRegDstALUSrcBranchMemWriteMemtoRegALUOpExtControlLinkLableJrLable
add110000000100
sub110000001100
ori101000010000
lw101001000100
sw0x101x000100
beq0x010x001100
lui101000100100
jal1xx00x000010
jr0xx00x000001
jal和jr

可以看出来,这个控制信号和P3的控制信号对比增添了两个信号。我采用比较笨的方式,对于jr和jal都直接用一个新的控制信号控制。

对于jal,LinkLable控制是否链接。当LinkLable为1时,会强制改变寄存器文件的输入地址和输入数据。同时,也会强制改变PC的值,表现在电路中等于是多加了一些多路开关,表现在代码中相当于多加了几个if。

对于jr,同理,JrLable会控制是否跳转。若JrLable为1,会强制修改PC的值。

需要注意的是,修改PC时一定要理清不同的特判间的关系,千万不能出现逻辑漏洞,比如没有给Branch=1,Zero=0这种情况赋值

结语

到这里,P3和P4间的差别基本讲完了,剩下的就看你对P3和P4的理解了。加油,过了P4就是P5,那才是重头戏。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
北航计组Verilog是指北京航空航天大学计算机学院的计算机组成原理课程设计中使用的Verilog HDL语言。Verilog HDL是一种硬件描述语言,用于设计和建模数字电路。在北航计算机学院的计算机组成原理课程设计中,学生需要使用Verilog HDL来实现一些具体的题目和实例,如课程设计中的PreProject-Verilog HDL与ISE Verilog题目实例与分析以及PreProject-Verilog HDL与ISE的获取和使用。通过这些实践,学生可以学习和理解Verilog HDL的基本语法和使用方式,以及时序电路的建模与分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [北航计算机组成原理课程设计-2020秋 PreProject-Verilog HDL与ISE-Verilog题目实例与分析](https://blog.csdn.net/JeremyZhao1998/article/details/113569664)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [北航计算机组成原理课程设计-2020秋 PreProject-Verilog HDL与ISE-ISE的获取和使用](https://blog.csdn.net/JeremyZhao1998/article/details/109180170)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

灰雾与红

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

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

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

打赏作者

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

抵扣说明:

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

余额充值