本文主要是介绍Modelsim 第一个仿真程序 四位加法器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
4位全加器
//4位全加器
module a4(sum,cout,a,b,cin);input [3:0] a,b;
input cin;
output cout;
output [3:0] sum;
assign {count,sum} = a+b+cin;
endmodule
4位全加器的仿真程序
//4位全加器的仿真程序
`timescale 1ns/1ns
`include "MyFirstVerilog.v"
module add3_top; 测试模块的名字
reg[3:0] a,b;//测试输入信号定义为 reg 型
reg cin;
wire[3:0] sum;//测试输出信号定义为 wire 型
wire cout; integer i,j;
a4 adder(sum,cout,a,b,cin); //调用测试对象
always #5 cin=~cin;//设定 cin 的取值
initial
begin a=0;b=0;cin=0;
for(i=1;i<16;i=i+1)
#10 a=i; //设定 a 的取值
end
initial
begin
for(j=1;j<16;j=j+1)
#10 b=j;//设定 b 的取值
end
initial
//定义结果显示格式
begin
$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);
#160
$finish;
end
endmodule
窗口效果
wave窗口
可以把波形缩放到合适大小,这样能看清细节
测试模块的编写——initial语句
首先说说结构化过程语句,在verilog中有两种结构化的过程语句:initial语句和always语句,他们是行为级建模的两种基本语句。其他所有的行为语句只能出现在这两种语句里。
与C语言不同,verilog在本质上是并发,而非顺序的。
verilog中的各个执行流程(进程)并发执行,而不是顺序执行的。
每个initial语句和always语句代表一个独立的执行过程,每个执行过程从仿真时间0开始执行并且两种语句不能嵌套使用。
下面举例解释之:
initial语句
所有的initial语句内的语句构成了一个initial块。initial块从仿真0时刻开始执行,在整个仿真过程中只执行一次。
如果一个模块中包括了若干个initial块,则这些initial块从仿真0时刻开始并发执行,且每个块的执行是各自独立的。
如果在块内包含了多条行为语句,那么需要将这些语句组成一组,一般式使用关键字begin和end将他们组合在一个块语句;如果块内只有一条语句,则不必使用begin和end.下面给出了initial语句的例子:
module stimulus reg x,y, a,b, m initial
m = 1*b0; initial
begin
#5 a = 1*b1;
#25 b = 1*b0;
end initial
begin
#10 x = 1*b0;
#25 y = 1*b1;
end initial
#50 $finish; endmodule
在上面例子中,三条initial语句在仿真0时刻开始并行执行。
如果在某一条语句前面存在延迟#,那么这条initial语句的仿真将会停顿下来,在经过指定的延迟时间之后再继续执行。因此上面的initial语句执行顺序为:
时间 所执行的语句
0 m = 1*b0;
5 a = 1*b1;
10 x = 1*b0;
30 b = 1*b0;
35 y = 1*b1;
50 $finish;
仿真时,出现:Error loading design 错误
遇到过类似的问题,代码编译没问题,但modelsim启动仿真的时候会报错,说Error loading design。一般都是一些内部信号定义不一致之类的问题。比如设计中有两个子模块A和B,A给B传递一个信号,但是A的输出端口和B的输入端口中,这个信号的类型、位宽等定义的不一致。这样的代码在编译时是检查不到语法错误的,在启动仿真时才能检测到两个模块之间的这个信号对接不上,所以才会报错。你再检查一下modelsim的日志文件(工程目录下的transcript),一般都能找到出问题的模块。Ps:编译通过只是说明代码中没有语法错误了,所以编译通过不代表代码就没问题了。
这篇关于Modelsim 第一个仿真程序 四位加法器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!