赞
踩
将陆续上传本人写的新书《自己动手写处理器》(尚未出版),今天是第九篇,我尽量每周四篇
上一节实现了一个简化的处理器取指电路,需要通过仿真以验证其功能是否正确,直观的仿真思路就是:给出一个时钟信号,上述电路会在每个时钟信号上升沿将取指地址加1,同时从指令存储器中取出一条指令,观察取指地址是否依次递增,同时观察取出的指令是否是存储器中取指地址对应的指令,如果都符合,那么上述取指电路就实现正确。此处涉及到两个问题。
1、如何在指令存储器中存储指令,也就是指令存储器初始化问题。
2、如何给出时钟信号?
本节将分别解答上述问题,在此基础上,使用ModelSim进行仿真。
初始化存储器有两种方法,一种是对存储器中每个存储单元依次给出初值,如下。
- rom[0] = 32'h00000000; //存储器rom的第0个元素初始化为0x00000000
- rom[1] = 32'h01010101; //存储器rom的第1个元素初始化为0x01010101
- rom[2] = 32'h02020202; //存储器rom的第2个元素初始化为0x02020202
- rom[3] = 32'h03030303; //存储器rom的第3个元素初始化为0x03030303
- ......
另一种方法是使用系统函数$readmemh,这样更加方便,但是后者只能用于仿真中。
除了$readmemh外,在Verilog HDL中还定义了很多系统函数,比如显示当前仿真时间的函数$time、显示信号值的函数$display、暂停仿真过程的函数$stop、结束仿真过程的函数$finish等。本书主要用到了$stop、$readmemh这两个系统函数。
1、$stop
$stop用于对仿真过程进行控制,暂停仿真,其使用格式如下。
- $stop(); // 使用格式一,不带参数
- $stop(n); // 使用格式二,带参数n,n可以等于0、1、2等值,含义如下:
- // 0:不输出任何信息;
- // 1:给出仿真时间和位置
- // 2:给出仿真时间和位置,还有其它一些运行统计数据
当仿真程序执行到$stop语句时,将暂时停止仿真,此时设计者可以输入命令,对仿真器进行交互控制。
2、$readmemh
$readmemh函数用于读取文件,其作用是从外部文件中读取数据并放入存储器中。使用格式如下。
$readmemh("数据文件名", 存储对象);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。