Modelsim仿真问题解疑:初始时间段内逻辑不符

目录

一、问题描述

    1.1 设计代码

    1.2 综合结果

    1.3 仿真结果

二、问题原因

三、解决方法

一、问题描述

    在使用mode​lsim进行功能仿真时,会遇到如下情况,仿真结果在前面一段时间内的逻辑输出不符预期,后面的结果符合预期

    以实现一个D触发器的逻辑为例

    1.1 设计代码

    功能简单,为一个异步清零的D触发器

module FF_test(d,ce,clk,clr,fdce  );
input d;
input ce;
input clk;
input clr;
output reg fdce;
always@(posedge clk,posedge clr)
    begin
    if(clr)
        fdce<=0;
    else
        if(ce)
            fdce<=d;
        else
            fdce<=0;
    end
endmodule

测试代码,根据输入数据d时间点变化将输入进行了两轮的变动,一轮在100ns以前,第二轮在100ns之后

`timescale 1ns / 1ns
module FF_tb();
reg d,ce,clk,clr;
wire out;
initial
begin
clk=0;
d=0;
ce=0;
clr=0;
//第一轮数据变化
#10 clr=1;
#4 clr=0;
#4 ce=1;
#11 d=1;
#10 d=0;
#10 d=1;
//第二轮数据变化

#60 clr=1;
#4 clr=0;
#4 ce=1;
#10 d=1;
#10 d=0;
#10 d=1;
end
//时钟周期2ns
always #1 clk=~clk;
FF_test FF(.d(d),.ce(ce),.clk(clk),.clr(clr),.fdce(out));
endmodule

    1.2 综合结果

    综合为FDCE,符合预期

Modelsim仿真问题解疑:初始时间段内逻辑不符_第1张图片

 

    1.3 仿真结果

    在红框1内,当ce=1,clr=0,输入数据d变化时,输出out一直为0,不符合预期逻辑,红框2内,在输出结果正确,clr为1时清零,输出为0,ce=1,clr=0时,out跟随d变化,符合预期

Modelsim仿真问题解疑:初始时间段内逻辑不符_第2张图片

 

二、问题原因

    仔细观察会发现,波形中多了一个全局复位信号GSR,在设计中是未体现的,该信号在100ns时进行了从1到0 的切换,切换之后,输出逻辑符合预期。

Modelsim仿真问题解疑:初始时间段内逻辑不符_第3张图片

 

    100ns来自何处?测试文件中未有设置,信号列表中选中该信号,点击鼠标右键,进入“Object Declaration”查看其来源。

Modelsim仿真问题解疑:初始时间段内逻辑不符_第4张图片

 

    GSR信号来源于FF_tb_func_impl.v文件的glbl模块,如下图,在125行定义了GSR信号,129行的initial模块中对GSR_int进行了赋值,初始值为1,等待ROC_WIDTH=100000(100ns)后状态变为0,符合前面的现象。

Modelsim仿真问题解疑:初始时间段内逻辑不符_第5张图片

 

Modelsim仿真问题解疑:初始时间段内逻辑不符_第6张图片

 

三、解决方法

    ​比较容易想到的办法是直接修改FF_tb_func_impl.v中initial模块,但该模块是仿真前生成的,修改重新运行会被覆盖。此时可借用modelsim的force功能,将GSR信号强制置为0再运行。

    ​操作:选中GSR信号,鼠标右键,执行restart将原有结果删除。

Modelsim仿真问题解疑:初始时间段内逻辑不符_第7张图片

 

   再选中GSR信号,选择“Force”,弹出下图弹框“Force Selected Signal”,在Value中将值改为1'h0,OK进行保存。

Modelsim仿真问题解疑:初始时间段内逻辑不符_第8张图片

 

     ​再将默认运行100ps修改为300ns,即运行300ns,最后执行run。如下图,GSR一直为低电平0,所以前100ns的结果也符合预期

Modelsim仿真问题解疑:初始时间段内逻辑不符_第9张图片

你可能感兴趣的:(modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器)