2014-01-08 79 views
2

我使用的ModelSim做模拟这些天,有问题来找我,那就是:的ModelSim编译器不一样的Quartus

而且thers是这样一块Verilog代码:

if (cnt == `END_CNT) 
... 
reg [7:0] cnt; 
always @(posedge clk) 
    if (en) 
     cnt <= cnt +1; 
... 

这意味着我将reg定义到分配块,并且我可以在定义之前使用该变量。这是我的编码风格,在Quartus中它可以正常工作。

但是,当我的ModelSim编译的文件,一个“变量未定义”错误会来的,我要搬到上面if语句定义行:

reg [7:0] cnt; 
... 
if (cnt == `END_CNT) 
... 
always @(posedge clk) 
    if (en) 
     cnt <= cnt +1; 
... 

我有很多这样的代码,这让我非常困扰。作为一个ModelSim初学者,我想知道是否有编译器设置(我找不到任何)来处理我的问题?

+4

按照IEEE标准1800年至二○一二年,第6.5节网和变量:“从隐式网在使用之前,数据应被宣布,除了”。你的代码不符合标准,你应该移动所有的声明。 – toolic

+1

根据我的经验,Modelsim是执行语言法律方面最严格的模拟器。 @toolic你应该让你的评论一个答案。 – dwikle

+0

@dwikle:我的评论并没有回答“是否有一个modelsim编译器设置?”的问题,并且SO用户不是很宽容。 – toolic

回答

0

Quartus verilog编译器不像modelsim那样严格,所以它可以让你做一些有趣的事情,比如你所提到的。

但是,根据Verilog标准,regs只能在声明之后使用,所以唯一的解决方法是在声明使用之前移动reg声明。

参考:SystemVerilog的标准(见6.5节:网和变量)http://standards.ieee.org/findstds/standard/1800-2012.html