草庐IT

modelsim 仿真 output no data原因探究

量墨 2023-04-08 原文

FPGA Verilog 相当于“Hello world"的一段入门代码:

module test(clk,a);
input clk;
output a;
reg [8:0]a;
always@(posedge clk)
begin
a <= a +1'b1;
end

endmodule

仿真TestBench 代码:

`timescale 1 ns/ 1 ps
module test_vlg_vec_tst();

reg clk;                                        
wire [8:0]  a;

always #10 clk=~clk;

initial
begin
  clk = 0;
  #120 $stop;

end            
test i1 (
.clk(clk),
.a(a)
);
endmodule

仿真界面, output a 是没有数据的,显示一串xxxxx.

 原因是变量a在初始化时没有被赋值,代码修改为:

module test(clk,rst,a);
input clk;
input rst;
output a;
reg [8:0]a;


always@(posedge clk or negedge rst)
begin
    if(!rst)
    begin
    a <= 9'b0;
    end
    else
    begin
   a <= a +1'b1;
    end
end

endmodule

testbench 修改为:

`timescale 1 ns/ 1 ps
module test_vlg_vec_tst();

reg clk; 
reg rst;                                       
wire [8:0]  a;

always  #10 clk=~clk;

initial
begin
  clk = 0;
  rst = 0;
  #10 rst = 1;
  #120 $stop;

end            
test i1 (
.clk(clk),
.a(a)
.rst(rst)
);
endmodule
仿真时,正确出现output a 变量的数值。

分析:

1. 其它编程语言如C++,在头文件声明了变量,有时不用初始化赋值,在后面做运算时,如a =a+1不会出错,计算过程和结果为1=0+1, 可见程序会自动将该变量初始化赋值为0. 但FPGA是面向硬件的编程,要求严谨,否则就会出现如上的问题。

其它注意点:

1.testbench 文件里面的端口连接部分,如缺少.rst(rst),变量 output a 也无数据,因为相当于rst端口在仿真时没有被使能,.v文件内的语句negedge rst、if(!rst) 将无作用,于是也不能对变量 output a 进行初始化赋值。

2. 对于always@(posedge clk or negedge rst)、if(!rst) 的理解: 仿真过程,观察发现0时刻,rst是高电平状态,即为1,(0时刻的线是一条从1到0的垂直线)于是可以实现0时刻,在rst的下降沿,如rst是0,则后面的对变量 output a 的赋值过程可以实施。

3.可否在testbench里面对Output a 进行初始化赋值?modelsim 直接报错,个人理解,FPGA 里的output a 不同于其它编程语言里面数值类型,其是真实对应于内部门电路的物理级输出。形象的理解,就如同一个三级管,输出端(集电极)的电流变化是基于输入(基级)电流的变化的。于是可以理解为必须要通过门电路的输入来控制输出,而不是直接给输出端直接赋值我们想要的结果

由于习惯于C,python等编程,以上分析可能有纰漏、错误之处,敬请指正。

有关modelsim 仿真 output no data原因探究的更多相关文章

  1. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  2. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  3. ruby-on-rails - 出于某种原因,我无法在控制台中生成重音字符 [é、ü 等] - 2

    在MacOS更新之前,它一直运行良好。我重新安装了RVM、rails、ruby等等。到目前为止没有任何效果。在我的Mac终端中,我可以生成一个é,但是在控制台中,我可以生成字符,使用alt+character,然后当我键入字符分配给的字母,它会删除该字符。在我的~/.rvmrc中:exportruby_configure_flags="--with-readline-dir=/usr/local/Cellar/readline/6.2.4"有什么想法吗?到目前为止,我已经明确地让它工作了,包括readline-rb。我猜我的全局要求不工作。gem'rb-readline','~>0.4

  4. ruby - 在 JRuby 中,如何确定导致 java.lang.ThreadDeath 的原因? - 2

    在为一些与JRuby中的临时文件交互的代码运行单元测试时,我有时会得到以下信息:Exception:java.lang.ThreadDeaththrownfromtheUncaughtExceptionHandlerinthread"Thread-6395"它似乎没有引起任何问题,但这是怎么回事,我如何确定它发生在哪里?我尝试打开-d,但这并没有给我异常的堆栈跟踪。 最佳答案 FWIW:这可能与http://jira.codehaus.org/browse/JRUBY-7074有关.我偶尔会在不使用反引号但调用系统的JRuby程序中

  5. ruby - 如何调试 gem 安装失败的原因? - 2

    我正在尝试安装geoutm使用geminstallgeoutm。Github存储库没有问题页面,所以我尝试自己解决问题然后提交拉取请求。这是问题:$geminstallgeoutmFetching:geoutm-1.0.1.gem(100%)Successfullyinstalledgeoutm-1.0.1ERROR:Whileexecutinggem...(TypeError)noimplicitconversionofArrayintoString它说“已成功安装”,但尝试要求gem失败。详细安装并没有多大用处:$geminstallgeoutm--verboseHEADhttps

  6. 开发人员使用Klocwork进行软件安全的五大原因 - 2

    Klocwork专为企业DevOps和DevSecOps而构建,是首选的静态分析和SAST工具,用于保持高开发速度,同时还强制实施安全性和质量的持续合规性。在这里,我们分享了开发人员选择Klocwork的五大原因。为什么安全性对软件开发至关重要?安全性对于软件开发至关重要,因为黑客和网络犯罪分子一直在寻找将漏洞转化为利益的方法。强大的软件安全防御的一个关键部分是使用安全编码标准,这些标准是用于防止安全漏洞的规则和准则。如果使用得当,安全编码标准可以检测、预防和消除可能危及安全性的漏洞。行业标准工具(特别是SAST工具)可以有效地实施标准,以帮助确保您的软件免受安全漏洞的侵害。开发人员使用Klo

  7. 一、51单片机 使用Proteus掌握LCD1602显示屏的使用(仿真及代码) - 2

    1、单片机控制液晶显示模块1602LCD的显示。液晶显示器(LiquidCrystalDisplay,LCD)具有省电、体积小、抗干扰能力强等优点,LCD显示器分为字段型、字符型和点阵图形型。(1)字段型。以长条状组成字符显示,主要用于数字显示,也可用于显示西文字母或某些字符,广泛用于电子表、计算器、数字仪表中。(2)字符型。专门用于显示字母、数字、符号等。一个字符由5、7或5、10的点阵组成,在单片机系统中已广泛使用(3)点阵图形型。广泛用于图形显示,如笔记本电脑、彩色电视和游戏机等。它是在平板上排列的多行列的矩阵式的晶格点,点大小与多少决定了显示的清晰度。引脚包括8条数据线、3条控制线和3

  8. ruby-on-rails - Rails - 在 Rails 控制台中,当您保存并得到 false 时,您如何找出原因? - 2

    在Rails控制台中,我正在创建一条记录,然后输入@record.save,我得到的结果是false,但我不明白为什么?RailsC有没有办法输出保存失败的原因?谢谢 最佳答案 通过errors实例方法访问错误。示例:ruby-1.8.7-p334:001>c=Company.new=>#ruby-1.8.7-p334:002>c.save=>falseruby-1.8.7-p334:003>c.errors=>#["can'tbeblank"]}> 关于ruby-on-rails-Ra

  9. ruby-on-rails - 我的应用程序一直在创建数据库连接,我该如何追踪原因? - 2

    我有一个在Heroku上运行的RubyonRails应用程序。我不断在日志中收到这些消息:2015-05-05T16:11:14Zapp[postgres.27102]:[AQUA]connectionreceived:host=xx.xxx.xx.26port=602782015-05-05T16:11:14Zapp[postgres.27102]:[AQUA]connectionauthorized:user=postgresdatabase=somedb2015-05-05T16:11:14Zapp[postgres.27103]:[AQUA]connectionreceived

  10. ruby-on-rails - Assets 管道中默认 require_tree 背后的原因是什么? - 2

    在Rails3.1中使用Assets管道时,它会创建一个默认的application.js://=requirejquery//=requirejquery_ujs//=require_tree.但我什么时候需要包含我所有的javascript?在大多数情况下,我们对不同的Controller/View使用不同的javascripts? 最佳答案 require_tree.将导致您有一个文件(在本例中为application.js)保存文件夹中的所有脚本。事实上,浏览器只会从您的Web服务器中提取该文件一次(除非您执行Ctrl+R刷

随机推荐