shawge

quartus 和 modelsim中的注意事项

0
阅读(5472)

quartus 和 modelsim中的注意事项


  1. 在《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. 未完待续……