20210323 Verilog学习笔记:过程赋值语句的阻塞和非阻塞语句的区分与实验

课本概念

阻塞型"=":

  1. 顺序块(begin-end)内的各条阻塞型语句顺序执行,并行块(fork-join)内的各条阻塞型语句并行执行,但不可综合
  2. 阻塞型赋值语句执行过程是:先计算右端赋值表达式的值,然后立即将结果赋值给左边变量,再执行下一条语句。

非阻塞型"<="

1.顺序块中非阻塞型语句的执行不会影响下一条语句的执行。
2.遇到非阻塞型语句时,先计算右端表达式的值,等到仿真时间结束后将结果赋值给变量,即非阻塞型语句的赋值过程是其他普通操作结束后才执行的。

实验1

module block(clk, din, out1, out2);
    input din, clk;
    output out1, out2;
    reg out1, out2;
    always @(posedge clk)
        begin
            out1 = din;
            out2 = out1;
        end
endmodule

1

module block(clk, din, out1, out2);
    input din, clk;
    output out1, out2;
    reg out1, out2;
    always @(posedge clk)
        begin
            out1 <= din;
            out2 = out1;
        end
endmodule

2

module block(clk, din, out1, out2);
    input din, clk;
    output out1, out2;
    reg out1, out2;
    always @(posedge clk)
        begin
            out2 = out1;
            out1 = din;
        end
endmodule

3

实验二

module block_2(a, b, c, sel, clk, out);
    input a, b, c, sel, clk;
    output out;
    reg out, temp;
    always @(posedge clk)
        fork
            temp = a & b;
            if(sel) out = temp | c;
            else out = c;
        join
endmodule

在这里插入图片描述

module block_2(a, b, c, sel, clk, out);
    input a, b, c, sel, clk;
    output out;
    reg out, temp;
    always @(posedge clk)
        fork
            temp <= a & b;
            if(sel) out = temp | c;
            else out = c;
        join
endmodule

在这里插入图片描述
实验二可见,因为非阻塞语句在普通操作结束后进行赋值,因此temp处多了一个D触发器。
个人理解是:多个输出书否由同一时钟多个触发器触发代表着多个输出之间的先后顺序,时钟同步代表同时进行,对应非阻塞赋值语句,否则代表顺序进行,对应阻塞赋值语句。但是实验一的第三个实验却有所不同,由于顺序的不同,导致第一个输出赋值时输入未进行操作,因此必须要两个D触发器。
这里仔细理解,有见解欢迎评论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值