新闻  |   论坛  |   博客  |   在线研讨会
modelsim 6.5SE 学习笔记
502593045 | 2011-07-12 09:51:28    阅读:21485   发布文章
这几天学习了下modelsim 6.5SE,做些总结以便复习。不一定正确,请浏览者不吝纠正指教。

软件:modelsim 6.5SE
代码来源:王金明:《Verilog HDL程序设计教程》

1、
文件夹Adder4中,adder_tb.v的$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);没有现象,出现警告:
Warning: (vsim-PLI-3003) E:/modelsim65SE/wangjinming/adder4/adder_tb.v(30): [TOFD] - System task or function '$minitor' is not defined.
 
2、
调用顶层文件的例化语句出现错误:
adder4 adder(.cout(cout),.sum(sum),.a(ina),.b(inb),.cin(cin));
错误原因:没分清调用和被调用模块的端口放置位置,正确的写法如下:
adder4 adder(.cout(cout),.sum(sum),.ina(a),.inb(b),.cin(cin));
 
3、
在做counter4的时候,刚开始没信号,如图:
原来以为是source insight的问题,删掉source insight的文件只保留counter4.v和counter4_tb.v之后,仍然是这个问题。经排查是因为在点击start simulation后没有去掉Enable optimization。
 
改正方法:去点红圈处的钩。或者如下图,右击要仿真的文件,选中Simulaiton without Optimization.

改正之后,Objects中出现了信号:


2011.7.4
4、
发现了
initial
$monitor($time,,,"clk=%d reset=%d out=%d",clk,reset,out);
的作用,仿真运行后,在Transcript中显示:
0 clk=0 reset=0 out= x
#                   50 clk=1 reset=0 out= x
#                  100 clk=0 reset=1 out= x
#                  150 clk=1 reset=1 out= 0
#                  200 clk=0 reset=0 out= 0
#                  250 clk=1 reset=0 out= 1
#                  300 clk=0 reset=0 out= 1
#                  350 clk=1 reset=0 out= 2
#                  400 clk=0 reset=0 out= 2
#                  450 clk=1 reset=0 out= 3
#                  500 clk=0 reset=0 out= 3
 
 
5、
在做好一个工程后,想要对另一个文件夹内的文件进行仿真,必须选择Change Directory。可是,选项是暗色的,不能选。我只有关掉modelsim,再打开,才可以选。后来发现,之所以之前不能选是因为还在仿真。只要关掉仿真就可以了。做法如下:选中Simulate->End Simulation。
 
 
6、
常用指令总结:
vlib work
vmap work work
vlog xxx.v
vcom xxx.vhd
add wave /name/ *
vsim xxxx
run xxx ns
quit –f
 
7、
语法错误parameter delay 10; 错因:忘记 = 改为:parameter delay = 10;
语法错误
AOI oi(.A(A),B(B),.C(C),D(D),.F(F));
错因:忘记 .
改为 AOI oi(.A(A),.B(B),.C(C),.D(D),.F(F));
 
8、
做AOI.v,编译后出现错误
** Error: E:/modelsim65SE/wangjinming/AOI/AOI_tb.v(13): (vlog-2110) Illegal reference to net "A".
错因:原来以为是A = 0; B = 0; C = 0; D = 0;两边没加begin end,加上后编译仍有此错误。后来才发现测试文件的信号定义错误。
源文件端口定义是:
input A,B,C,D;
output F;
测试文件的信号定义应该是:
reg A,B,C,D;
wire F;
即:源文件的输入端在测试文件中定义为reg,源文件的输出端在测试文件中定义为wire.
 
9、
仿真mux4_1时,我用指令vsim mux4_1_tb,现象objects中没有信号,即没有去掉Enable Optimization。不知道怎么用命令进行不加Enable Optimization的操作,暂时还用鼠标点击选项吧。
 
10、
对一个语法的理解
之前我使用的时间单位和时间精度为:`timescale 1ns/1ns,在modelsim的横坐标是每一小格为1ns。2011.7.5发现这个结论不对。目前还不能确定仿真时如何设置每小格的大小的。有待进一步研究。2011.7.8发现,时间单位没有确定仿真的每小格的单位,之所以每小格会显示不同的大小,是因为仿真图放大缩小的缘故。
 
11、
测试模块中的时钟语句:always #delay clk = ~clk;
初始化中必须有clk = 1 或者 clk = 0;否则,仿真时clk无变化。
 
12、
测试文件中调用源文件模块,则测试文件开头必须用`include “file.v”包含
测试文件开头如果没有`timescale,则会默认是`timescale 1ns/1ns
 
2011.7.5
13、
警告:
Warning: (vsim-3009) [TSCALE] - Module 'decode4_7' does not have a `timescale directive in effect, but previous modules do.
原因:在测试文件中有:`timescale 。。。,而在源文件中没有
解决方法:在源文件中加入`timescale。。。。如果是`timescale 1ns/1ns,则都可忽略,软件会默认。
 
14、
做【例5.13】用casez 描述的数据选择器时出现问题。
代码如下:
module mux_casez(out,a,b,c,d,select);
output out;
input a,b,c,d;
input [3:0] select;

reg out;

always @(select or a or b or c or d)
begin
casez(select)
4'b???1 : out = a;
4'b??1? : out = b;
4'b?1?? : out = c;
4'b1??? : out = d;
endcase
end

endmodule 
`include "mux_casez.v"

module mux_casez_tb;
wire out;
reg a,b,c,d;
reg [3:0] select;

initial 
begin
a = 1; b = 0; c = 1;d = 0;
#20 select = 4'b???1;
#20 select = 4'b??1?;
#20 select = 4'b?1??;
#20 select = 4'b1???;
#20 $stop;
end

mux_casez mux_casez(.out(out),.a(a),.b(b),.c(c),.d(d),.select(select));

endmodule 

仿真结果怎么会是这样的呢?

out应该先后电平是1 0 1 0的啊?为什么一直是1
刚开始有人说把casez改成case。这样虽然仿真正确,如下图:

但这就违背了这个例程的要求。后经人指点,将测试文件的?都改为0。仿真也是对的。甚至将测试文件中的?改为等价的z,仿真也是没有现象。
 
2011.7.6
15、
调用另一个文件时,要使用`include。如果写在一个文件内,则被调用模块要写在调用模块之前。
 
16、
如果用连续赋值语句assign,则被赋值变量不能定义reg。如下是错误的,需要去掉reg cout;。
assign cout = (qout == 4'hf) ? 1 : 0;
 
17、
测试文件中初始化initial开始要把所有的输入初始化。,否则可能仿真时一直是未知状态。

错误原因就是在初始化代码中忽略了data = 0;
 
18、
【例6.8】顺序执行模块1【例6.9】顺序执行模块2两个模块不会仿真。
 
2011.7.8
19、
在做第八章【例8.20】2 选1 多路选择器的仿真的时候,得到的结果不正确,与书上的不同。
 
 
2011.7.9
20、
不太熟悉`define的用法。
 
21、
下午在做【例9.27】4 位串并转换器,编写好测试文件,打开modelsim,建工程,编译通过,正要仿真,发现找不到测试文件。重新建立工程后出现,吓我一跳,还以为软件坏了。
后来发现另一个问题,这个代码没看懂,加了注释,如下:
module serial_pal(clk,reset,en,in,out);
       input clk,reset,en,in;
       output [3:0] out;
      
       reg [3:0] out;
      
       always @(posedge clk)
       begin
              if(reset)
                     out <= 4'h0;
              else if(en)
                     out <= {out,in};     //不懂
       end
      
endmodule
 
编译时出现错误:
** Error: E:/modelsim65SE/wangjinming/nine_chapter/serial_pal/serial_pal.v(1): near "EOF": syntax error, unexpected "end of source code"
去掉这个注释后,编译通过。明明被注释了,不知为何还是出错。这个串并转换有缺陷,应该每四位输出一次的。估计是软件发神经了。
 
22、
Verilog区分大小写的

2011.7.21
23、
做后仿真时,将源文件、测试文件和Quartus编译生成的.vo文件一起编译,仿真时选中测试文件后记得加入仿真库及在SDF下加入Quartus编译生成的sdo文件。



附上王金明《Verilog 程序设计教程》及书中代码。
王金明Verilog HDL程序设计教程.pdf
王金明:《Verilog_HDL_程序设计教程》书中所有代码.doc

2011.9.17
关于这ModelSim SE后仿真的资料许多,但是大部分描述不完整或者主次不分,给初学者带来麻烦。在此,附上我初学时参考的基于Quartus II + ModelSim SE的后仿真教程。我觉得有针对性且容易学会。
基于Quartus II + ModelSim SE的后仿真.zip


2012.5.6
换了自己的笔记本,重新安装modelsim 6.5SE并破解。按照《基于Quartus II + ModelSim SE的后仿真(Verilog版)》中的步骤添加altera仿真库,执行完第二步即新建好文件夹altera_base_v后,要编译仿真库,可是菜单栏中的compile是灰色的,无法选中。我原来以为是没有破解好。几经周折,偶然发现关闭工程后,才能选择主菜单中的compile。

2012.5.9
测试文件引用原文件的路径用/,而不是\
参与讨论
登录后参与讨论
771801383  2013-07-31 14:54:34 

万事开头难啊。

mingyuanyu  2013-01-23 20:55:39 

你好,可以和我分享一下modelsim和quartus吗?还有破解方式,谢谢! 820875723@qq.com

iweimo  2011-07-19 09:39:42 

写的不错,我最近也正在学modelsim,要学后仿真,还得会用quartus

虾虽在江湖,江湖却没有关于虾的传说!
推荐文章
最近访客