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

这篇具有很好参考价值的文章主要介绍了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仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

    1.3 仿真结果

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

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

二、问题原因

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

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

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

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

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

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

三、解决方法

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

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

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

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

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器

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

Modelsim仿真问题解疑:初始时间段内逻辑不符,modelsim,Vivado,Xilinx,fpga开发,Modelsim,仿真结果,逻辑不符,100ns,触发器文章来源地址https://www.toymoban.com/news/detail-540719.html

到了这里,关于Modelsim仿真问题解疑:初始时间段内逻辑不符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hive sql,年月日 时分秒格式的数据,以15分钟为时间段,找出每一条数据所在时间段的上下界限时间值(15分钟分区)

    获取当前的年月日 时分秒 date_format(时间字段, ‘yyyy-MM-dd HH:mm:ss’) 将时间字段转为 2023-10-18 18:14:16 这种格式 在指定时间上增加15分钟 unix_timestamp:获取当前时间的UNIX时间戳(从 1970-01-01 00:00:00 UTC 到指定时间的秒数),然后加上 15*60 秒,即15分钟,就得到了15分钟后的时间戳

    2024年02月08日
    浏览(41)
  • Linux查询指定时间段的日志

    Linux查询指定时间段的日志 可以通过grep或者sed命令查指定时间段日志 1.命令 命令: 2.举例 【例】查询今天10月20日10点30分的这一分钟的日志 第一步,可以先看下日志文件的格式 第二步,通过grep提取和匹配符合条件的字符串行 或者用sed查询 注意事项

    2024年02月12日
    浏览(38)
  • docker导出指定时间段内日志

    命令格式如下: 起始时间 :指定要导出日志的起始时间,格式为YYYY-MM-DDTHH:MM:SS。 结束时间 :指定要导出日志的结束时间,格式为YYYY-MM-DDTHH:MM:SS。 容器ID或名称 :指定要导出日志的Docker容器ID或名称。 导出文件路径 :指定导出日志的文件路径和文件名。 例如,要导出容器

    2024年02月06日
    浏览(35)
  • docker查询某时间段的日志

    参考:docker logs 查看docker容器日志详解_Mym_zuoyan_Tmac的博客-CSDN博客_docker logs 查找

    2024年02月16日
    浏览(39)
  • matlab根据时间列筛选到特定时间段(小时、天、月、年)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 在处理带时间标签的数据时,往往需要对数据进行筛选,本文将介绍一下利用matlab根据时间标签对数据进行筛选的一种方法。 提示:以下是本篇文章正文内

    2024年02月12日
    浏览(34)
  • Linux查询提取指定时间段的日志

    在 Linux 中,可以使用 sed 、 awk 命令快速提取一个日志文件中指定时间段之间的日志信息。下面提供两种方法: 首先,假设要提取的日志文件为 log.txt 。假设要提取 2023 年 06 月 01 日 00:00:00 到 2023 年 06 月 01 日 01:00:00 之间的日志信息,可以使用以下命令: 该命令的解释如下:

    2024年02月12日
    浏览(37)
  • Unity TimeLine循环播放某个时间段

    1、设置Playable Director的Update Method为GameTime模式 2、API : using UnityEngine.Playables; 我们需要用到PlayableDirector的time属性 3、设置开始和结束时间段(使用的帧率)我在0-158帧循环和158到290帧之间循环 4、代码 代码笔记

    2024年02月11日
    浏览(40)
  • vue 封装一个鼠标拖动选择时间段功能

       

    2024年02月15日
    浏览(28)
  • PostgreSQL处理时间段、时长转为秒、分、小时

    如果要计算某个时间点到某个时间点的时长或时间段是多少,并且要转换为秒、分、小时的话,我们可以按下面的例子处理 首先,举例计算2023年4月19日10点整 到2023年4月20日22点00分30秒的时长 结果为: 1 day 12:00:30 现在将结果转换为秒、分、小时 结果为: 129630 结果为: 216

    2024年02月12日
    浏览(23)
  • 【hbase】按时间段批量删除hbase数据

    背景是华为大数据平台mrs,这里运用到HDFS、Hive、HBase;数据通过接口接入到hbase,用hive创建hbase外部表。需求是某段时间数据有问题,需要删掉重新补入。 HBase删除操作 1、获取rowkey 方法1:通过hbase命令scan, TIMERANGE 这个是通过数据的插入时间进行过滤 方法2:通过hbase命令

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包