Verilog基础:时序调度中的竞争(一)

news2024/11/15 18:20:32

相关阅读

Verilog基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        作为一个硬件描述语言,Verilog HDL常常需要使用语句描述并行执行的电路,但其实在仿真器的底层,这些并行执行的语句是有先后顺序的,然而Verilog标准并没有将这些事件调度的顺序定死,而是给予了仿真器厂商一定的自由去实现自己的产品,这就导致了设计者如果不遵循一定的编程习惯,会导致意想不到的仿真结果,下面是一些相关的规则。

1、不要在两个及以上的always或initial结构中对同一个变量赋值

        当两个以上的过程结构同时执行时,它们之间的执行顺序是不一定的,Verilog标准只规定了在一个顺序块(begin end)中的所有语句是按照其先后顺序执行的,但并没有规定同一个时间执行的多个结构的执行顺序,下面举例详细说明。

//例1
`timescale 1ns/1ps
module test();
    initial $display("The initial_0 execute");
    initial $display("The initial_1 execute");
    initial $display("The initial_2 execute");
endmodule

        在上例中,三个initial结构在0ns时同时执行,仿真器执行他们的顺序是不定的,但测试表明,许多仿真器都选择顺序执行这三个initial结构,如下所示。

对于Mentor Modelsim SE,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Aldec Riviera Pro,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Cadence Xcelium,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Mentor Questa,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Synopsys VCS,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Icarus Verilog,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

         虽然看起来仿真器的行为都是一致的,但其实这只是一个巧合,下面的例子就体现出了各种仿真器对同一段代码之间的不同行为。

//例2
`timescale 1ns/1ps
module test();
  	reg a;
    initial #5 a = 1;
  	initial @(a) $display("The initial_0 execute");
    initial @(a) $display("The initial_1 execute");
    initial @(a) $display("The initial_2 execute");
endmodule

        这段代码的三个initial结构都对事件a敏感,所以在5ns时,三个initial结构同时被触发,而他们的执行顺序是不定的,如下所示。

对于Mentor Modelsim SE,输出结果为
The initial_2 execute
The initial_1 execute
The initial_0 execute

对于Aldec Riviera Pro,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Cadence Xcelium,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Mentor Questa,输出结果为
The initial_2 execute
The initial_1 execute
The initial_0 execute

对于Synopsys VCS,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execut

对于Icarus Verilog,输出结果为
The initial_2 execute
The initial_1 execute
The initial_0 execute

        下面的代码中仍然体现了同一时间的多个结构的执行顺序是不定的,即使触发这些结构的事件在同一时间是有前后关系的。

//例3
`timescale 1ns/1ps
module test();
  	reg a, b, c;
  	 initial begin
        #5;
        a = 1;
        b = 1;
        c = 1;
    end
    
   always @(a) $display("The initial_0 execute");
   always @(b) $display("The initial_1 execute");
   always @(c) $display("The initial_2 execute");
endmodule

        在5ns时,a、b、c先后被赋值为1,Verilog标准保证了begin end块中的赋值顺序从上到下。但由这些赋值语句触发的其他always结构呢?是否也会按照a、b、c的顺序执行呢?

对于Mentor Modelsim SE,输出结果为
The initial_2 execute
The initial_1 execute
The initial_0 execute

对于Aldec Riviera Pro,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Cadence Xcelium,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

对于Mentor Questa,输出结果为
The initial_2 execute
The initial_1 execute
The initial_0 execute

对于Synopsys VCS,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execut

对于Icarus Verilog,输出结果为
The initial_0 execute
The initial_1 execute
The initial_2 execute

        依然可以注意到不同仿真器之间的差异,为什么不都是按照a赋值,always @(a)执行,b赋值,always @(b)执行,c赋值,always @(c)执行的顺序执行呢?还是那句话,Verilog标准只规定了一个顺序块(begin end)中的所有语句是按照其先后顺序执行的,并没有保证其他行为。当a赋值后,always @(a)被调度了,但他不一定会在b赋值之前执行,有可能在执行完b赋值、c赋值之后再来执行always @(a),此时always @(b)和always @(c)也应该在队列中,他们执行的先后顺序是标准没有保证的(但需要注意的是,最基本的调度者和被调度者的先后关系是无法改变的,即always @(a)一定在a赋值后,b、c亦然)。下面是一个经典的两个结构交错执行的例子。

//例4
`timescale 1ns/1ps
module test();
  	reg a;
  	wire b;
	 initial begin
        #1;
        a = 1;
        #1;
        a = 0;
        $display("b is %b", b);
   end
   assign b = a;
  
endmodule

         当时间来到1ns,a被赋值为1,同时触发assign结构,对b连续赋值为1。1ns后,a被更改为0,紧接着打印b的值,结果是1还是0呢?

对于Mentor Modelsim SE,输出结果为
b is 1

对于Aldec Riviera Pro,输出结果为
b is 1

对于Cadence Xcelium,输出结果为
b is 1

对于Mentor Questa,输出结果为
b is 1

对于Synopsys VCS,输出结果为
b is 0

对于Icarus Verilog,输出结果为
b is 0

        上面的结果显示,仿真器可能在执行了a=0的赋值后立刻执行被调度的assign连续赋值,再返回initial结构执行显示语句,也可能继续执行下面的显示语句,再去执行被调度的assign连续赋值。

        这就给了我们一个启示,在改变了一个全组合逻辑的电路的输入后,紧接着显示输出,可能无法得到更新后的输出。一个更好的做法是给$display语句一定的延时,这样就能确保在执行$display前,连续赋值已经执行完毕,因为不同时间的语句执行是不会产生竞争的。

//例5
`timescale 1ns/1ps
module test();
  	reg a;
  	wire b;
	 initial begin
        #1;
        a = 1;
        #1;
        a = 0;
        #0.01 $display("b is %b", b);
   end
   assign b = a;
  
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1248416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NeurIPS 2023 | RGIB:对抗双边图噪声的鲁棒图学习

▐ 摘要 链接预测[1,2]是图学习的一种基础任务,用于判断图中的两个节点是否可能相连,被广泛应用于药物发现、知识图谱补全和在线问答等实际场景。尽管图神经网络(Graph Neural Network,GNN)在该问题的性能上取得了显著…

JMeter 常见易错问题

1、配置错误: 问题:线程组配置错误,例如设置了错误的线程数或循环次数。 解决方法:检查线程组的配置。确保线程数(即并发用户数量)设置正确,以及循环次数符合预期。如果要模拟不同类型的用户行…

怎样自动把网页截图发到微信群里

现在很多公司都在使用企业微信了,不但方便公司内部交流和客户交流,还能组建各种小组群,业务群。企业微信群提供一个机器人的功能,方便我们把公司业务信息,或来自外部的信息自动发布到群里。 这里研究一下如何向微信群…

Docker的项目资源参考

Docker的项目资源包括以下内容: Docker官方网站:https://www.docker.com/ Docker Hub:https://hub.docker.com/ Docker文档:https://docs.docker.com/ Docker GitHub仓库:https://github.com/docker Docker官方博客…

MT6893_天玑 1200芯片规格参数介绍_datasheet规格书

天玑 1200(MT6893)是一款专为旗舰级全新5G芯片,它融合了先进的AI、相机和多媒体技术,为用户带来令人惊叹的体验。采用先进的6纳米制程设计,内置各种先进技术。该芯片采用旗舰级的八核CPU架构设计,支持16GB强大的四通道内存以及双通…

jQuery_03 dom对象和jQuery对象的互相转换

dom对象和jQuery对象 dom对象 jQuery对象 在一个文件中同时存在两种对象 dom对象: 通过js中的document对象获取的对象 或者创建的对象 jQuery对象: 通过jQuery中的函数获取的对象。 为什么使用dom或jQuery对象呢? 目的是 要使用dom对象的函数或者属性 以及呢 要…

DQN算法

DQN算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main DQN算法 DQN(Deep Q-Network) 主要创新点在于将Q-learning算法中的Q表记录动作价值函数转为引入深度神经网络来近似动作价值函数 Q ( s , a ) Q(s,a) Q(s,a),从而能够处理连续…

【Java 进阶篇】Jedis:让Java与Redis轻松对话的利器

在现代软件开发中,缓存系统是提高系统性能的常见手段之一,而Redis作为一个高性能的缓存数据库,被广泛应用于各类系统。如果你是Java开发者,那么使用Jedis库可以让你轻松地与Redis进行交互。本文将带你深入了解Jedis的快速入门&…

pat实现基于邻接矩阵表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(Graph G, int v) {visited[v] 1;printf("%c ", G.vexs[v]);for (int i 0; i < G.vexnum; i) {if (!visited[i] && G.arcs[v][i]) DFS(G, i);} }2.非递归 #include <stack> #include <iostream> …

【间歇振荡器2片555时基仿真】2022-9-24

缘由multisim出现这个应该怎么解决吖&#xff0c;急需解决-嵌入式-CSDN问答 输出一定要有电阻分压才能前后连接控制否则一定报错。

【Web】PhpBypassTrick相关例题wp

目录 ①[NSSCTF 2022 Spring Recruit]babyphp ②[鹤城杯 2021]Middle magic ③[WUSTCTF 2020]朴实无华 ④[SWPUCTF 2022 新生赛]funny_php 明天中期考&#xff0c;先整理些小知识点冷静一下 ①[NSSCTF 2022 Spring Recruit]babyphp payload: a[]1&b1[]1&b2[]2&…

C#,《小白学程序》第二课:数组,循环与排序

1 什么是数组&#xff1f; 数组 Array 是一组数值&#xff08;数 或 值&#xff09;。 int[] a; int[,] b; int[][] c; Anything[] d; 都是数组。 2 排序 排序就是按大小、名字、拼音或你指定的信息进行比较后排队。 排序是数组最基本的功能需求。 3 文本格式 /// <summa…

【C语言】memset函数

memset是C和C编程语言中的一个函数&#xff0c;用于将指定的内存区域设置为特定的值。这个函数的原型在<string.h>&#xff08;对于C&#xff09;或者<cstring>&#xff08;对于C&#xff09;头文件中定义。 函数原型如下&#xff1a; void *memset(void *str, i…

Halcon Solution Guide I basics(4): Blob Analysis(连通性解析)

文章目录 文章专栏前言文章解析开头步骤分析简单案例进阶方案 进阶代码案例crystal&#xff0c;结晶匹配需求分析 文章专栏 Halcon开发 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 前言 今天来看第三章内容&#xff0c;既然是零基础&#xff0c;而且我还有大…

数据库-MySQL之数据库必知必会10-13章

第10章 创建计算字段 拼接字段 使用Concat()函数 执行算术计算 示例&#xff1a;从 Products 表中返回 prod_id、prod_price 和 sale_price。sale_price 是一个包含促销价格的计算字段。提示&#xff1a;可以乘以 0.9&#xff0c;得到原价的 90%&#xff08;即 10%的折扣&…

C百题--7.输出乘法表

1.问题描述 输出9*9乘法表 2.解决思路 利用99乘法表行和列之间的关系&#xff0c;进行输出 注意&#xff1a;%-2d 2代表占两个字符&#xff1b;-代表左对齐 3.代码实现 #include<stdio.h> int main(){for(int i1;i<9;i){for(int j1;j<i;j){printf("%d*%d…

98、Text2Room: Extracting Textured 3D Meshes from 2D Text-to-Image Models

简介 github 利用预训练的2D文本到图像模型来合成来自不同姿势的一系列图像。为了将这些输出提升为一致的3D场景表示&#xff0c;将单目深度估计与文本条件下的绘画模型结合起来&#xff0c;提出了一个连续的对齐策略&#xff0c;迭代地融合场景帧与现有的几何形状&#xff0…

基于若依的ruoyi-nbcio流程管理系统增加流程节点配置(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 为了增加流程节点配置的功能的灵活性与方便性&#xff0c;这里增加流程节点的配置。 1、相应表结构如下&a…

百度云加速免费版下线,推荐几款目前仍旧免费的CDN

近日&#xff0c;百度云加速实施了新政策&#xff0c;将不再支持免费套餐服务。现在免费的CDN也越来越少了&#xff0c;推荐几款目前仍旧免费的CDN&#xff0c;大家且用且珍惜&#xff01; 1、雨云【点此直达】 源站为雨云产品可以免费使用CDN&#xff0c;源站非雨云产品流量包…

CANdelaStudio 使用教程2 新建 Interface

文章目录 简述ECU Information1、Supported Interfaces2、Services supported for interfaces 简述 新增 Interface 的话&#xff0c;只能在 CDDT 文件中新增&#xff0c;CDD 文件中只能选择接口 ECU Information 1、Supported Interfaces 创建和编辑ECU应支持的接口 1、…