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