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

阻塞赋值和非阻塞赋值

理论学习

                阻塞赋值 用                 =        表示 ,这种对应的电路结构常常与触发器没有关系,只与输入电平的变化有关系。可以将阻塞赋值的操作看作只有一个步骤的操作,即将计算赋值符号的右边赋值给左边,在未执行完之前,不允许其他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 clk
    
    always(posedge sys_clk or negedge sys_rst_n )
    begin
        if(sys_rst_n == 1'b0)
        begin
            in_reg    =    2'b0    ;
            out       =    2'b0    ;
        end
        else
        begin
            in_reg    =    in        ;
            out       =    in_reg    ;
        end
    end




endmodule

阻塞赋值对应的tb

`timescale    1ns/1ns



module    tb_blocking();


    reg    sys_clk        ;
    reg    sys_rst_n      ;
    reg    [1:0]    in    ;
    wire   [1:0]    out   ;


    initial
    begin
        sys_clk     =         1'b0    ;
        sys_rst_n   <=        1'b0    ;
        int         <=        2'b0    ;
        #20    ;
        sys_rst_n   <=        1'b1    ;
    end

    always #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)
    begin
        if(sys_rst_n == 1'b0)
        begin
            in_reg    <=    2'b0    ;
            out       <=    2'b0    ;
        end
        else
        begin
            in_reg    <=    in        ;
            out       <=    in_reg    ;
        end
    end


endmodule

非阻塞赋值对应的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          ;


    initial
    begin
        sys_clk     =    1'b1    ;
        sys_rst_n  <=    1'b1    ;
        in         <=    2'b0    ;
        #20    ;
        sys_rst_n  <=    1'b1    ;
    end


    always #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.kler.cn/a/506833.html

相关文章:

  • Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)
  • 玩转随机数:用 JavaScript 掌控不可预测的魔力!
  • 【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍
  • MCP Server开发的入门教程(python和pip)
  • 网络编程 - - TCP套接字通信及编程实现
  • 【Vue3 入门到实战】3. ref 和 reactive区别和适用场景
  • 初学stm32 --- CAN
  • 在 pom.xml 文件中指定 repositories
  • 论文高级GPT指令推荐
  • HTML学习笔记记录---速预CSS(2) 复合属性、盒子模型、边框线、浮动、定位
  • 50.【8】BUUCTF WEB HardSql
  • knowledge-vue监听传入值变化请求后端数据更新
  • 如何在linux系统上完成定时开机和更新github端口的任务
  • springboot 项目配置https
  • Rust 零大小类型(ZST)
  • 【设计模式-结构型】装饰器模式
  • C++ union 联合(八股总结)
  • 微调神经机器翻译模型全流程
  • 紫光无人机AI飞控平台介绍
  • Mybatis-Plus:简介、入门案例
  • 【Excel】【VBA】双列排序:坐标从Y从大到小排列之后相同Y坐标的行再对X从小到大排列
  • 【matlab】matlab知识点及HTTP、TCP通信
  • npm发布工具包+使用
  • windows11下 podman-desktop 复制插件文件 到 RabbitMQ 容器内,并启用
  • 安全规约、脱敏规范、敏感逻辑的保护方案、防止 SQL 注入
  • 25/1/16 嵌入式笔记 STM32F108