首页 > 其他分享 >阻塞赋值和非阻塞赋值

阻塞赋值和非阻塞赋值

时间:2025-01-17 20:28:11浏览次数:3  
标签:clk 阻塞 sys rst out reg 赋值

理论学习

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

标签:clk,阻塞,sys,rst,out,reg,赋值
From: https://blog.csdn.net/m0_46644085/article/details/145187843

相关文章

  • SAP-ABAP赋值语句详解及举例
    在ABAP(AdvancedBusinessApplicationProgramming)中,赋值语句用于将一个值或表达式的结果赋给变量。ABAP提供了几种不同的赋值方式,取决于变量的类型和所需的操作。以下是一些常见的赋值语句示例:基本赋值:使用=符号将值赋给变量。DATA:lv_variableTYPEi.lv_variable=......
  • 使用QFuture和QFutureWatcher实现不阻塞界面的Async函数
    简述很多时候,在Qt里面需要运行一个耗时函数的时候,为了避免阻塞界面,需要放入非主线程去执行。实现这样处理的方法有好几种,例如:写一个继承自QThread类,实现run接口;写一个继承自QObject的类,添加槽函数执行任务,创建对象,移入一个QThread中进行调用;写一个QRunnable的子类,创建对象,添......
  • I/O 模型——阻塞 I/O、非阻塞 I/O、 I/O 多路复用、信号驱动 I/O、异步 I/O
    目录1.阻塞I/O(BlockingI/O)2.非阻塞I/O(Non-blockingI/O)3.I/O多路复用(I/OMultiplexing)4.信号驱动I/O(Signal-drivenI/O)5.异步I/O(AsynchronousI/O)总结I/O模型(Input/OutputModel)定义了程序与外部设备(如磁盘、网络、终端等)之间的数据交互方式。在计算机系......
  • Java ProcessBuilder 启动的进程阻塞不退出问题。
    https://wiki.sei.cmu.edu/confluence/display/java/FIO07-J.+Do+not+let+external+processes+block+on+IO+buffers java通过调用进程读取输出启动进程的标准输出时,如果被调用进程的,标准输出以及错误流的缓冲区被写满,后续写入会导致调用进程会卡住,无法正常结束。 确保waiffo......
  • c++ 赋值运算符的定义
    1.赋值运算符的定义赋值运算符是用于修改已有对象的内容,而不是用于创建新对象。其典型的定义如下:Person&Person::operator=(constPerson&other);Person&Person::operator=(Person&&other);左侧对象(*this):表示已经存在的目标对象。右侧对象(other):表示要从中复制或转......
  • java中的赋值机制
    赋值机制:基本数据类型的赋值,赋值方式为值拷贝【相互不产生影响】;数组数据类型的赋值,赋值方式为引用赋值【相互产生影响】;实质,仍为值拷贝,只是基础数据类型和引用数据雷类型的存储空间不一样;java虚拟机,jvm,存在三个空间:栈,堆,方法区基本数据类型变量的值存储在栈,当存在变量相......
  • Effective C++读书笔记——item12(自定义拷贝构造函数和拷贝赋值运算符可能出现的问题
    1.拷贝函数相关背景及编译器行为在面向对象系统中,拷贝构造函数和拷贝赋值运算符统称为拷贝函数,若不自行声明,编译器会按需生成默认的拷贝函数,其会拷贝被拷贝对象的全部数据。但当自行声明拷贝函数后,编译器若发现实现存在错误,往往不会主动提示,比如在新增数据成员却未更新拷贝函......
  • Effective C++读书笔记——item11(自赋值)
    自赋值相关问题自赋值情况示例明显的自赋值如w=w,还有不太容易辨别的情况,像a[i] =a[j](当i和j值相同)、*px=*py(当px和py指向同一对象)等,这些是由别名(有多种引用对象的方式)造成的,尤其在涉及引用、指针操作同类型多个对象以及继承体系中基类和派生类对象引用、指针转换时要考......
  • 高级java每日一道面试题-2025年01月05日-并发篇-什么是阻塞队列?阻塞队列的实现原理是
    如果有遗漏,评论区告诉我进行补充面试官:什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?我回答:在Java高级面试中,阻塞队列是一个非常重要的概念,它涉及到多线程并发编程的核心知识。以下是对阻塞队列的详细解释,包括其定义、实现原......
  • C中如何进行字符串赋值和字符串转换?
    C语言中字符串赋值和字符串转换的详细说明字符串赋值在C语言中,字符串是以字符数组的形式存储的,并以空字符\0作为结束符。因此,字符串赋值不能直接使用=操作符,而是需要使用专门的函数进行复制。以下是几种常见的字符串赋值方法:「直接初始化」直接在声明字符数组时初始化字符......