当前位置: 首页 > news >正文

阻塞赋值和非阻塞赋值

理论学习

                阻塞赋值 用                 =        表示 ,这种对应的电路结构常常与触发器没有关系,只与输入电平的变化有关系。可以将阻塞赋值的操作看作只有一个步骤的操作,即将计算赋值符号的右边赋值给左边,在未执行完之前,不允许其他verilog语句执行。

                非阻塞赋值 用           <=        表示,这种对应的电路结构常常与触发沿有关系,只有在触发沿才能执行。非阻塞逻辑开始时 先计算式子右边的语句,赋值操作结束时才更行式子左边的语句,可以认为需要两个步骤来完成赋值。非阻塞赋值执行的时候,其他verilog语句都能同时计算。

阻塞赋值

module    blocking    
(input    wire    sys_clk    ,input    wire    sus_rst_n    ,input    wire    [1:0]    in    ,output   reg     [1:0]    out
);reg    [1:0]    in_reg    ;//给out延迟 1 clkalways(posedge sys_clk or negedge sys_rst_n )beginif(sys_rst_n == 1'b0)beginin_reg    =    2'b0    ;out       =    2'b0    ;endelsebeginin_reg    =    in        ;out       =    in_reg    ;endendendmodule

阻塞赋值对应的tb

`timescale    1ns/1nsmodule    tb_blocking();reg    sys_clk        ;reg    sys_rst_n      ;reg    [1:0]    in    ;wire   [1:0]    out   ;initialbeginsys_clk     =         1'b0    ;sys_rst_n   <=        1'b0    ;int         <=        2'b0    ;#20    ;sys_rst_n   <=        1'b1    ;endalways #10    sys_clk     <=    ~sys_clk    ;always #20    in          <=    {$random}%4 ;blocking    blocking_inst(.sys_clk      (sys_clk)      ,.sys_rst_n    (sys_rst_n)    ,.in           (in)           ,.out          (out));endmodule

非阻塞赋值,可以看到这样子有两组寄存器。

module    non_blocking
(input    wire    sys_clk      ,input    wire    sys_rst_n    ,input    wire  [1:0]   in     ,output   reg   [1:0]   out 
);reg    [1:0]    in_reg    ;always@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n == 1'b0)beginin_reg    <=    2'b0    ;out       <=    2'b0    ;endelsebeginin_reg    <=    in        ;out       <=    in_reg    ;endendendmodule

非阻塞赋值对应的tb,结果发现,in和in_reg有一个clk延时,in_reg和out有一个延时,也就是in和out有两个延时。

module   tb_non_blocking();reg    sys_clk      ;reg    sys_rst_n    ;reg    [1:0]    in           ;wire   [1:0]    out          ;initialbeginsys_clk     =    1'b1    ;sys_rst_n  <=    1'b1    ;in         <=    2'b0    ;#20    ;sys_rst_n  <=    1'b1    ;endalways #10    sys_clk    =    ~sys_clk    ;always #20    in    <=    {$random}%4    ;non_block    non_block_inst(.sys_clk        (sys_clk)      ,.sys_rst_n      (sys_rst_n)    ,.in             (in)           ,.out            (out));endmodule 

http://www.lryc.cn/news/522184.html

相关文章:

  • Maven在Win10上的安装教程
  • 攻防世界_SQL注入
  • Ruby语言的数据结构
  • Jmeter配置服务代理器 Proxy(二)
  • Spring Boot 中实现 WebSocket 的方式
  • C语言初阶习题【29】杨氏矩阵
  • [操作系统] 深入理解操作系统的概念及定位
  • Java中对list数据进行手动分页(可直接复用版)
  • 【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页
  • 《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析
  • 【IDEA 2024】学习笔记--文件选项卡
  • Android SystemUI——服务启动流程(二)
  • iOS - 内存对齐
  • 小游戏前端地区获取
  • AIGC时代:如何快速搞定Spring Boot+Vue全栈开发
  • MDX语言的多线程编程
  • Vue.js组件开发-实现输入框与筛选逻辑
  • 配置Allure环境变量【macOS版】
  • AndroidStudio升级到2024.2.2项目AGP升级8.8.0版本记录
  • Require:利用MySQL binlog实现闪回操作
  • 计算机网络 (40)域名系统DNS
  • UE5游戏性能优化指南
  • Gitlab Runner安装与配置
  • 如何有效防止和解决IP劫持问题
  • 2006-2020年各省人均水资源量数据
  • C++基础入门(二)
  • 互联网架构困境:网络与信息安全
  • HIVE技术
  • RustDesk ID更新脚本
  • 卷积神经网络的底层是傅里叶变换