过程赋值语句

过程快块中的赋值语句被称为过程赋值语句。过程性赋值是在initial语句或者always语句内的赋值。过程赋值语句有阻塞赋值语句和非阻塞赋值语句两种。
1.阻塞赋值语句
阻塞赋值语句的操作符号为“ = ”,其语法格式如下:
变量 = 表达式;
例如:b = a;
特点:
1.在串行语句块中,各条阻塞赋值语句将按照排列顺序依次执行;在并行语句块中,语句同时执行,没有先后之分
2.执行阻塞赋值语句的顺序是,先计算等号右端表达式的值,然后立刻将计算的值赋给左边的变量,与仿真时间无关
下面是一个阻塞赋值语句的例子,该程序只能综合出一个D触发器。

module dut_blocking(clk,a,c);
    input clk,a;
    output c;
    reg b,c;

    always @(posedge clk) begin
        b=a;
    end
    always @(posedge clk) begin
        c=b;
    end

endmodule

测试代码如下:

module tb_blocking;
    reg clk;
    reg a;
    wire c;

    dut_blocking inst1(
        .clk   (clk),
        .a     (a),
        .c     (c)
    );

    initial begin
        $monitor("clk=%b,a=%b,c=%b",clk,a,c);
    end

    initial begin
        clk=1'b0;
        forever begin
            #10;
            clk=~clk;
        end
    end

    initial begin
        repeat (20) begin
            #0  a=1'b0;
            #22 a=1'b1;
            #60 a=1'b0;
            #80 a=1'b1;
            #100;
        end
        $finish();//finish simulation
    end
    initial begin
        $fsdbDumpfile("blocking_dut");
        $fsdbDumpvars;
        $vcdpluson;
    end

endmodule

编译、仿真之后,用DVE工具打开
在这里插入图片描述
仿真波形图如图所示,当上升沿到来的时候,采样到数据a,a立刻赋值给b,b又立刻赋值给c

2非阻塞赋值语句
非阻塞赋值语句的操作符号为“ <= ”,其语法格式如下:
变量 <= 表达式;
例如:b <= a;
特点:
1.在串行语句块中,各条阻塞赋值语句执行没有先后顺序之分,后面语句的执行不会受到前面语句的限制,各条语句并行执行
2.执行非阻塞赋值语句的顺序是,先计算等号右端表达式的值,然后等待延迟时间的结束,再将计算的值赋给左边的变量
下面是一个非阻塞赋值语句的例子

module non_blocking(clk,a,c);
    input clk,a;
    output c;
    reg b,c;

    always @(posedge clk) begin
        b<=a;
    end
    always @(posedge clk) begin
        c<=b;
    end
    
endmodule

测试代码同上
编译、仿真之后,用DVE工具打开
在这里插入图片描述
仿真波形图如图所示,当上升沿到来的时候,采样到数据a,a赋值给b,但是b不是立刻赋值给c,当前时刻c依然保持上一时刻b的值。因为这两条语句没有先后关系,综合后会产生两个D触发器。
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值