流水线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,然后仿真的结果
单周期的时候也是这么设置的,一开始忘记了...
流水线cpu —Verilog HDL的更多相关文章
- 流水线技术原理和Verilog HDL实现(转)
源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...
- [转载]【转】乘法器的Verilog HDL实现
乘法器如果直接用*来实现的话,会消耗很多的资源.所以有了串行和并行两种实现思路.用串行的话,8位一般会有8位以上的延迟,但是消耗的资源是最少的.低速数据处理比较适合.并行也就是流水线方法,以时间换 ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- 关于初次使用Verilog HDL语言需要懂的基本语法
关于初次使用Verilog HDL语言需要懂的基本语法 1.常量 数字表达式全面的描述方式为:<位宽><进制><数字> 8’b10101100,表示位宽为8的二进制 ...
- FPGA Verilog HDL 系列实例--------步进电机驱动控制
[连载] FPGA Verilog HDL 系列实例 Verilog HDL 之 步进电机驱动控制 步进电机的用途还是非常广泛的,目前打印机,绘图仪,机器人等等设备都以步进电机为动力核心.那么,下面我 ...
- Verilog HDL基础语法讲解之模块代码基本结构
Verilog HDL基础语法讲解之模块代码基本结构 本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的 ...
- Verilog HDL模块的结构
一个设计是由一个个模块(module)构成的.一个模块的设计如下: 1.模块内容是嵌在module 和endmodule两个语句之间.每个模块实现特定的功能,模块可进行层次的嵌套,因此可以将大型的数字 ...
- 写自己的第二级处理器(3)——Verilog HDL行为语句
我们会继续上传新书<自己动手写处理器>(未公布),今天是第七章,我每星期试试4 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包含有过程语句,过 ...
- 基于Verilog HDL 各种实验
菜鸟做的的小实验链接汇总: 1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...
随机推荐
- 使用 gitlab-runner 持续集成
gitlab-runner 是 Gitlab 推出的与 Gitlab CI 配合使用的持续集成工具.当开发人员在 Gitlab 上更新代码之后,Gitlab CI 服务能够检测到代码更新,此时可以触发 ...
- web项目启动链接mysql巨慢
说明:项目部署到测试服务器上,mysql部署在另一台服务器上,项目第一次启动之后登陆后台很慢,大概30s左右,经查发现第一次访问数据库的时候会通过DNS解析客户端机器域名,mysql还有DNS反向解析 ...
- scrapy的大文件下载(基于一种形式的管道类实现)
scrapy的大文件下载(基于一种形式的管道类实现) 爬虫类中将解析到的图片地址存储到item,将item提交给指定的管道 在管道文件中导包:from scrapy.pipelines.images ...
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池.按照发展历程,业界知名的数据库连接池有以下几种:c3p0.DBCP.Tomcat JDBC ...
- tornado大全(甩锅版)
tornado简介 tornado是Python界中非常出名的一款Web框架,和Flask一样它也属于轻量级的Web框架. 但是从性能而言tornado由于其支持异步非阻塞的特性所以对于一些高并发的场 ...
- 【UltraISO】中文破解版
下载链接:https://cn.ultraiso.net/uiso9_cn.exe简体中文版专用: 注册名:Guanjiu 注册码:A06C-83A7-701D-6CFC多国语言版专用: ...
- 浅析Linux启动流程
Linux系统启动流程 Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程.了解 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助 ...
- 死锁案例 GAP 锁 没有就插入,存在就更新
https://mp.weixin.qq.com/s/2obpN57D8hyorCMnIu_YAg 死锁案例八 文 | 杨一 on 运维 转 | 来源:公众号yangyidba 一.前言 死锁其实是一 ...
- PIGS_POJ1149
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20253 Accepted: 9252 Description ...
- 微信小程序--使用云开发完成支付闭环
微信小程序--使用云开发完成支付闭环 1.流程介绍 2. 代码实现和逻辑思想描述 云函数统一下单 对应云函数 unipay [CloudPay.unifiedOrder] 函数思路 : 调用云函数封装 ...