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,符合预期

    1.3 仿真结果

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

二、问题原因

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

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

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

三、解决方法

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

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值