quartus 和 modelsim中的注意事项
0赞quartus 和 modelsim中的注意事项
-
在《The IEEE Verilog 1364-2001 Standard》标准中,允许只有1bit的wire型变量不需要事先声明直接使用。如下代码在quartus中以verilog 2001编译不会报错,但是在modesim中就会报错。
即在quartus中你可以如下写:
assign wSignal = 1'b1; //不必事先声明
在modelsim中你该改为这样(为了兼容和适应不同版本的EDA工具,同时为了更好的可阅读性,我们建议以下面这种方式书写):
wire wSignal; //当然也可以在这里直接附值 assign wSignal = 1'b1;
在quartus中启用verilog-2001标准的操作步骤:
Assignments->settings->Analysis & Synthesis Settings -> Verilog HDL Input
在modelsim中启用verilog-2001标准的操作步骤:
在modelsim主窗口中:Complie->Verilog & SystemVerilog中的Language Syntax
2. 在modelsim和quartus中,如果你将本模块的的输入端口连接到该模块子模块的输出端口,都不会报错(如下),
module A ( ... done, .... ) input done;//此处误将输出信号写成了输入信号 /////// moudelB u_B ( ... .done(done), ... ); endmodule
也就是说如果你在代码中误将本模块的输出型端口定义成了输入型,那么当你对这个端口进行附值时,modelsim和quartus都是不会报错的(当然会在调用该模块的顶层模块中产生警告)。
3. 在verilog代码中,你的组合逻辑如果以always段书写,但没有写敏感表,
always data = dataIn;
modelsim仿真时会一直卡在那里,出现“A time value could not be extracted from the current line”,而无论quartus或者modelsim编译的时候都不会对这个产生错误或者警告。
4. 对于用于标记的信号Flag,应该采用时钟打一拍,而不是采用这种直接组合逻辑的写法,
assign doneSdrInit = (init_timer == INIT_PER+202) ? 1'b1 : 1'b0; //tMRD
上面的写法初看没有问题,但是由于信号未与时钟对齐,在某些情况下就会出现仿真和SignalTap捕获到结果不一致的问题,
图中的doneSdrInit在仿真中信号是在clk的上升沿设为高(符合设计初衷),clk只能在下一个时钟采样到该信号为高。
而在SignalTap中我们看到的结果去是这样的,clk可以就在当前时钟捕获到doneInitSdr。
造成这种不一致的是因为在实际综合后doneInitSdr就是一个组合逻辑,其结果与它所依赖的信号时时相关即刻反应,而仿真是以clk为时钟信号去离散模拟的,尽管实际上doneInitSdr早已为高。因而改为下面这种形式。
always @(posedge CLK, negedge RESET_N) begin if(!RESET_N) doneSdrInit <= 1'b0; else begin if(init_timer == INIT_PER+202) doneSdrInit <= 1'b1; end end
通过系统时钟将doneSdrInit与时钟对齐。
5. 未完待续……