casez语句的顺序执行还是并行执行

本文探讨了Verilog编程中的casez和ifelse结构在电路实现中的行为差异,指出casez即使满足所有条件也会执行第一个匹配的语句,而ifelse则取决于工具综合后的电路实现。作者通过实例和波形图解释了这一现象,并推荐了避免混淆的编码方式。
摘要由CSDN通过智能技术生成

1,先放一句从知乎看到的话:通常认为if else是串行的,case 是并行的。然而现在工具综合完成的电路中,if else用法综合的电路可以是并行的,case综合出来的电路也可以是串行的。所以个人认为现在所说的串行,并行应该仅仅指语法判断过程,并非指电路了。

2,自己测试。代码如下
测试当in = 8‘b1111_1111时是满足所有casez中的条件的,那么到底会执行哪一个语句呢?

module test_case(
    input [7:0] in,
    output reg [2:0] pos 
    );   
     always @(*)
        casez(in)
            8'bz1zz_zzzz: pos = 3'd6;
            8'bzzzz_zz1z: pos = 3'd1;
            8'bzzzz_z1zz: pos = 3'd2;
            8'bzzzz_zzz1: pos = 3'd4;
            8'bzzzz_1zzz: pos = 3'd3;
            8'bzzz1_zzzz: pos = 3'd4;
            8'bzz1z_zzzz: pos = 3'd5;
            8'b1zzz_zzzz: pos = 3'd7;
            default: pos = 3'd0;
        endcase
endmodule

仿真代码如下:

module test_case_tb();
    reg [0:7]in = 8'b1111_1111;
    wire [2:0]pos;
    //这里还有一个点要考:不管子模块本身的输出是wire型还是reg型,在对子模块调用时,输出接    //口必须接wire 型变量。
    test_case test(.in(in), .pos(pos));
endmodule

波形图如下: 可以看到当输入是1111_1111时输出时6,和代码的第一个对应,并且不会执行下面其他符合条件的casez语句。
波形图
当我把casez中第一个条件的代码改了之后:

module test_case(
    input [7:0] in,
    output reg [2:0] pos 
    );   
     always @(*)
        casez(in)
            ***8'bzz1z_zzzz: pos = 3'd5;***
            8'bz1zz_zzzz: pos = 3'd6;
            8'bzzzz_zz1z: pos = 3'd1;
            8'bzzzz_z1zz: pos = 3'd2;
            8'bzzzz_zzz1: pos = 3'd4;
            8'bzzzz_1zzz: pos = 3'd3;
            8'bzzz1_zzzz: pos = 3'd4;
            8'b1zzz_zzzz: pos = 3'd7;
            default: pos = 3'd0;
        endcase
endmodule

波形图如下
在这里插入图片描述
所以结论就是casez语句中如果一个控制语句符合所有的casez对应的条件,那么它只会执行第一个casez的语句。但是在case中时不允许这样的事情发生的。而在casez语句中为了避免这样的写法让自己很难确定程序到底怎么运行的,一般建议如下写法:

module top_module (
    input [7:0] in,
    output reg [2:0] pos );
    
    always @(*)
        casez(in)
            8'bzzzz_zzz1: pos = 3'd0;
            8'bzzzz_zz10: pos = 3'd1;
            8'bzzzz_z100: pos = 3'd2;
            8'bzzzz_1000: pos = 3'd3;
            8'bzzz1_0000: pos = 3'd4;
            8'bzz10_0000: pos = 3'd5;
            8'bz100_0000: pos = 3'd6;
            8'b1000_0000: pos = 3'd7;
            default: pos = 3'd0;
        endcase
endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值