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

news2024/12/24 21:09:38

相关阅读

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


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

2、在创建分频时钟时,使用阻塞赋值

        在描述一个对时钟沿敏感的时序逻辑时,普遍的建议是使用非阻塞赋值去描述寄存器操作。但这不是绝对的,当这个寄存器操作的对象是生成时钟时,如果使用了非阻塞赋值,就有可能造成仿真出现错误,下面就是一个时钟竞争的例子。

`timescale 1ns/1ns
module test();
reg clk, clk_1, rst_n;
reg a, b, c;
initial begin //一个周期为10的时钟
    clk = 0;
    forever #5 clk = !clk;
end

//第一个always块
always@(posedge clk, negedge rst_n) begin //一个分频时钟,周期为20
    if(!rst_n) begin
        clk_1 <= 1'b0;
    end
    else begin
        clk_1 <= !clk_1;
    end
end

//第二个always块
always@(posedge clk, negedge rst_n) begin //第一个寄存器使用原时钟触发
    if(!rst_n) begin
        b <= 1'b0;
    end
    else begin
        b <= a;
    end
end

//第三个always块
always@(posedge clk_1, negedge rst_n) begin //第二个寄存器使用分频时钟触发
    if(!rst_n) begin
        c <= 1'b0;
    end
    else begin
        c <= b;
    end
end


initial begin
    rst_n = 0;
    #3 rst_n = 1;
end

initial begin
    a  = 1;
    #24 a = 0;
end
endmodule

        上面是一个很简单的例子,即两个寄存器对输入打两拍,不过第一个寄存器使用10ns的周期,第二个寄存器使用20ns的周期。竞争会出现在两个时钟的上升沿重合时,此时可能的事件调度过程分析如下。

  1. initial块中的clk取反后为高电平,触发第一个always块和第二个always块。如Verilog基础:时序调度中的竞争(一)所说,这两个块的执行顺序是不定的。
  2. 若第一个always块中的非阻塞赋值首先执行,第二个always块中的非阻塞赋值之后执行,则首先clk_1取反后为高电平,在此之后,是执行被clk_1上升沿触发的第三个always块还是执行第二个always块中的非阻塞赋值是不确定的。若先执行第二个always块后再执行第三个always块,则c会直接得到a的值,而不会有任何等待。若先执行第三个always块后执行第二个always块,则是正常打拍。
  3. 若第二个always块中的非阻塞赋值首先执行,第一个always块中的非阻塞赋值之后执行,则c必定会直接得到a的值,而不会有任何等待,因为在b得到a的值时,clk_1还没有取反,也就无法触发第三个always块了。

        因为在25ns时,两个时钟的上升沿重合,所以在24ns时我们将a拉低,测试波形如图1所示。

图1 一个有竞争的波形图

        可以看到在a=0后的下一个上升沿,b和c同时被拉低,这就是竞争所导致的结果。解决这个问题也很简单,只需要将第一个always块中的非阻塞赋值改为阻塞赋值即可,如下所示。

always@(posedge clk, negedge rst_n) begin //一个分频时钟,周期为20
    if(!rst_n) begin
        clk_1 = 1'b0;
    end
    else begin
        clk_1 = !clk_1;
    end
end

         这样做有什么用?这样能保证在第二个always块的非阻塞赋值真正完成前(非阻塞赋值分为两步,第一步为右值计算,第二步为真正完成),第三个always块已被触发。下面是修改后没有竞争的波形。

 

 

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

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

相关文章

2019年7月18日 Go生态洞察:新Go商店公告 ️

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

HCIA-H12-811题目解析(2)

1、【单选题】 在以太网这种多点访问网络上PPPOE服务器可以通过一个以太网端口与很多PPPOE客户端建立起PPP连接&#xff0c;因此服务器必须为每个PPP会话建立唯一的会话标识符以区分不同的连接PPPOE会使用什么参数建立会话标识符? 2、【单选题】PPP协议定义的是OSI参考模型中…

二叉树题目:结点与其祖先之间的最大差值

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;结点与其祖先之间的最大差值 出处&#xff1a;1026. 结点与其祖先之间的最大差值 难度 5 级 题目描述 要求 给…

树莓派 cpolar实现内网穿透

树莓派 cpolar实现内网穿透 cpolar官网介绍 cpolar官网 树莓派安装cpolar 使用ssh连接树莓派终端&#xff0c;输入以下命令&#xff0c;即可安装cpolar curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash安装完成后可输入cpolar v…

AIGC系列之:Transformer原理及论文解读

目录 模型概述 Transformer输入 Word Embedding Positional Encoding Transformer的输出 Self Attention Multi-Head Attention Encoder结构 最后层的输出 Masked Multi-Head Attention Decoder输入 Decoder的输出 Transformer训练和推理过程 《Attention is All …

网络工程师应知必会的网络故障排查手段,你用过几个?

你们好&#xff0c;我的网工朋友。 网络排错对于网络工程师或运维人员甚至对很多人&#xff08;搞IT的朋友们&#xff09;都是基操。 所以知道网络排错的详细流程和流程中每一步的原理&#xff0c;就显得很关键了。 当网络出现问题时&#xff0c;你能迅速排查出网络问题所在…

Pytorch深度学习实战2-1:详细推导Xavier参数初始化(附Python实现)

目录 1 参数初始化2 Xavier参数初始化原理2.1 前向传播阶段2.2 反向传播阶段2.3 可视化思考 3 Python实现 1 参数初始化 参数初始化在深度学习中起着重要的作用。在神经网络中&#xff0c;参数初始化是指为模型中的权重和偏置项设置初始值的过程。合适的参数初始化可以帮助模型…

阿里云服务器部署node和npm

目录 1.链接服务器2.找到node 下载地址3获取链接地址4下载到linux5.解压6.重命名 解压后的文件7.配置环境变量7.1复制当前的bin目录7.2vim /etc/profile7.3在按下ESC按键 8.重启环境变量9.输入node10.npm配置加速镜像 1.链接服务器 2.找到node 下载地址 https://nodejs.org/d…

C++——解锁string常用接口

本篇的内容是记录使用string接口的测试与使用&#xff0c;方便后续使用时查阅使用 首先介绍 string::npos; size_t&#xff08;无符号整型&#xff09;的最大值。NPOS 是一个静态成员常量值&#xff0c;具有 size_t 类型元素的最大可能值。当此值用作字符串成员函数中 len&am…

希宝猫罐头怎么样?专业人士告诉你性价比高的猫罐头推荐

作为一家经营猫咖店已有6年的店长&#xff0c;我在这段时间里接触过不少于30种不同的猫罐头。在猫罐头上我还是有话语权的。通过本文&#xff0c;我将与大家分享值得购买的猫罐头&#xff0c;分享猫罐头喂养的技巧。那么希宝猫罐头表现怎么样呢&#xff1f; 希宝猫罐头可是采用…

Python GUI 图形用户界面程序设计,Python自带 tkinter 库

文章目录 前言GUI介绍简单操作tkinter组件介绍向窗体中添加按钮控件使用文本框控件使用菜单控件使用标签控件使用单选按钮和复选按钮组件使用绘图组件关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集…

【多线程】-- 04 静态代理模式

多线程 3 静态代理 这里以一个现实生活中的例子来解释并实现所谓的静态代理模式&#xff0c;即结婚者雇用婚庆公司来帮助自己完成整个婚礼过程&#xff1a; package com.duo.lambda;interface Marry {void HappyMarry();//人生四大乐事&#xff1a;久旱逢甘霖&#xff1b;他…

自动化测试|我为什么从Cypress转到了Playwright?

以下为作者观点&#xff1a; 早在2019年&#xff0c;我就开始使用Cypress &#xff0c;当时我所在的公司决定在新项目中放弃Protractor 。当时&#xff0c;我使用的框架是Angular&#xff0c;并且有机会实施Cypress PoC。最近&#xff0c;我换了工作&#xff0c;现在正在使用R…

springboot自定义更换启动banner动画

springboot自定义更换启动banner动画 文章目录 springboot自定义更换启动banner动画 &#x1f4d5;1.新建banner&#x1f5a5;️2.启动项目&#x1f516;3.自动生成工具&#x1f9e3;4.彩蛋 &#x1f58a;️最后总结 &#x1f4d5;1.新建banner 在resources中新建banner.txt文…

C#——多线程之异步调用容易出现的问题

C#——多线程之异步调用容易出现的问题 Q1&#xff1a;For中异步调用函数且函数输入具有实时性 Q1&#xff1a;For中异步调用函数且函数输入具有实时性 在项目进行过程中&#xff0c;发现For中用异步调用带有输入参数的函数时&#xff0c;会由于闭包特性&#xff0c;以及Task.…

ssm+vue的公司安全生产考试系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的公司安全生产考试系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

C#从零搭建微信机器人(二)分词匹配组件【jieba】的使用

上篇文章我们讲解了微信机器人的环境搭建及演示&#xff0c;这期我们来说一下其中在模糊匹配搜索时用到的Segement子项目&#xff0c;也就是其中的中文分词匹配器。 一、原理介绍&#xff1a; 其实这个子项目中的分词插件和solr的IK分词器类似&#xff0c;都是可以支持将一句…

TP4066L是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。

TP4066L 采用ESOP8/DFN2*2-8封装 1A线性锂离子电池充电器 描述&#xff1a; TP4066L是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的ESOP8DFN2*2-8封装与较少的外部元件数目使得TP4066L成为便携式应用的理想选择。TP4066L可以适合USB电源和适…

桐庐县数据资源管理局领导一行莅临美创科技并带来感谢信

11月23日&#xff0c;浙江桐庐县数据资源管理局党组成员、副局长朱勃一行到访美创科技总部参观交流&#xff0c;并带来感谢信&#xff0c;对美创圆满完成护航亚运政务外网数据网站安全保障工作表示充分肯定。美创科技联合创始人、副总裁胡江涛等进行热情接待并开展交流座谈。 图…

微信ipad协议8.0.37/8.0.40新版本

功能如下&#xff0c;如有定制功能请在官网联系我们。 登录 创建新设备 获取登录er维码 执行登录 注销登录 消息 消息回调 消息撤回 发送app类型消息 发送小程序 发送CDN文件 发送CDN图片 发送CDN视频 发送emoji 发送文件 发送图片 发送链接 发送消息 发送视频 发送语音 …