流水线cpu —Verilog HDL

一.准备工作

先看看书(《计算机原理与设计 Verilog HDL版》),搞懂一点原理。然后照着书上的代码写一写(用8.4的就可以了,不用8.6的)。

注意mux2x32,mux4,cla32等可以用单周期的mux,alu。 (cla32就是个加法器,)

然后dffe32在书上前几章也有。

pipeimem即为im指令存储器,可以套用单周期的IM。

pipemem是数据存储器,可以套用单周期的dm

regfile 可以套用单周期的RF。

alu可以完全套用单周期的alu。pipecu中的aluc,rij型的wire,以及wreg中的一部分都可以套用单周期的代码。只是注意要调整好,不要多写,少写,导致错误。(我犯过错误就是,alu的功能与pipecu的aluc不一致,少写了一些东西,导致数据读入都出问题。)

需要理解流水线cpu的各种问题及解决对策。

比如lw指令从memory读到register,在mem级才可以前推(forward)到id级,这样如果下一条指令要用到寄存器的 结果,需要阻塞(stall)一周期,否则已经进入了exe级了而书上示例的cpu只能forward到id级。

这里补充一点,用了8.4的代码,然后为了消除控制冒险,要在mars的测试文件(.asm)中,每一条J型指令后加一个nop。这里是因为看8.2.2,采用了延迟槽技术,i指令是跳转类指令,i+1无论如何都会被执行。(提前到在ID级判断是否要跳转),这里加nop,刚好取代了i+1。

二.调整接口&&细节调整

写完代码,modelsim编译成功。(或者有问题,按照transcript的提升改一改)。

然后start simulation、

simulation失败,提升error loading design。

error loading design的原因基本上是:模块名错误(定义的和使用的。),参数错误(接口错误,比如参数顺序不一致,参数宽度不一致)

注意网上看error loading design很多都说没有提示,这是误导了。(导致我自己不看提示改了一天,虽然确实也改好了一些吧)确实提示不多,但是modelsim transricpt 在start simulation 后也会有一些error提示的

Error: (vsim-3043) E:/pipe3/pipelinecomp_tb.v(55): Unresolved reference to ‘ID‘ in U_SCCOMP.U_SCPU.ID.

这个就提示ID不知道是啥。

然后我看了一下pipelinecpu中,pipeid 起名id_stage ,而不是ID。把ID改成id_stage就完事了

调整接口很困难(对我来说)。要细心。

比如clrn就是rest等等,需要理解后替换。

比如因为仍然使用了单周期的顶层例化文件,comp中cpu模块只有一个aluout的例化,那么就不能按照8.4的代码在module cpu里ealu,malu,walu三个输出。其中walu,ealu改为wire型。malu改名为aluout,仍保留为输出。

还有pipemem(即为DM,data‘memory)因为在comp中例化,就不需要像8.4中一样在module pipelinecpu中使用了。

还有许多细节,需要自己摸索。

三.效果

还是学号排序,应该是成功了

放错图了

这是mars setting momeryconfiguration text at address,然后assemble,然后dump的结果。

正确的图

先设置mars setting momeryconfiguration data at address,assemble,不要运行,dump,然后仿真的结果

单周期的时候也是这么设置的,一开始忘记了...

原文地址:https://www.cnblogs.com/lqerio/p/11117618.html

时间: 2024-08-15 09:21:00

流水线cpu —Verilog HDL的相关文章

MiS603 开发板2.2 Verilog HDL硬件语言基础

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.2 Verilog HDL硬件语言基础 2.2.1 技术背景 大规模集成电路设计制造技术和数字信号处理技术,近三十年来,各自得到了迅

3_8译码器Verilog HDL语言的简单实现

最近在学Verilog HDL语言,觉得learn in doing是比较好的学习方式,所以我们来直接分析分析代码好了. 先来一波代码: 1 module q_decode_38(data_in,data_out); 2 3 input[2:0] data_in; //端口声明 4 output[7:0] data_out; 5 reg[7:0] data_out; 6 7 always@(data_in) 8 begin 9 case(data_in) 10 3'd0:data_out = 8

基于Verilog HDL整数乘法器设计与仿真验证

基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为0表示为正数),取值范围为-127~127. 负数的表示方法为正值的求反又加1.例如: 8’b0000_0100; //表示值:4,正值求反为:8’b1111_1011:再加1表示为:8’b1111_1100,这样便得到了-4的表示方法为:8’b1111_1100. 同理,负值变成正值的方法为:负值

<转>Verilog HDL宏定义define

宏定义 `define 用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define signal string 它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string.这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串

自己动手写处理器之第二阶段(3)——Verilog HDL行为语句

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第七篇,我尽量每周四篇 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包括有过程语句,过程语句有两种:initial.always.其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的.此外,always过程语句是可综合的,initial过程语句是不可综合的.       1.always过程语句 always过程语句的格式如图2-10所示.

verilog HDL 编码风格

1.有意义且有效的名字. 2.同一信号在不同层次应该保持一致. 3.添加有意义的后缀,使信号的有效性更加明确. 4.模块输出寄存器化,使得输出的驱动强度和输入延时是可以预测的. 5.使用括号表明优先级. 6.每一个if都应该有一个else.如果esle没有任何相应的动作,则用一条空语句.(if..esle可能有优先级) 7.case 语句最好有一个default分支,如果default不要执行动作就使用空语句. 8.在每个 模块的开始做模块级的注释,在模块端口列表中出现的信号做简要的功能描述.

Verilog HDL基础语法讲解之模块代码基本结构

Verilog HDL基础语法讲解之模块代码基本结构 ? 本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的基本结构. 以下为本章中例子中的代码: 01????/*======================================= 02????*????file neme : mux2.v 03????*????author????:????小梅哥 04????*????Verison????:????

MiS603开发板 2.1 Verilog HDL 代码规范

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.1 Verilog HDL 代码规范 规范的代码风格,可以让程序更容易阅读和维护. u 文档管理 合理的文档管理也是程序代码规范的重

Verilog HDL实现奇数次分频

在数字逻辑电路中,经常需要设计分频电路,本文是通过Verilog HDL实现了奇数次分频. 以下是设计程序源代码: module freq_div( // Input clk_50, rst_n, // Output clk_div2, clk_div5 ); parameter DIVN = 5; input clk_50; // Clockinput rst_n; // Resetoutput clk_div2; // indicates write transferoutput clk_d