Verilog中case结构控制表达式能否使用多变量按位与运算
Verilog case语句使用按位与控制表达式的合规性说明
语法合规性结论
原写法符合Verilog语法规范,可以正常通过编译、仿真与综合,不存在语法错误。
需要先明确Verilog的位运算规则:1位信号a和6位信号b做按位与运算时,a会先做零扩展到6位(等价于{5{1'b0}, a}),最终a & b的运算结果是6位位宽,完全可以作为case语句的控制表达式。你在分支项里写的1'b0 & 6'd0、1'b1 & 6'd1属于常量表达式,会在编译阶段直接计算出结果(分别为6'd0、6'd1),也符合语法要求。
实际功能与预期偏差
虽然语法合法,但这段代码几乎不可能实现多数人写这段代码时的预期逻辑(即匹配a、b各自的取值组合),核心问题有两个:
- 按位与会丢失变量取值信息:当
a=1'b0时,无论b取0到63之间的任何值,a & b的结果都是6'd0,都会命中第一个分支给c赋值1'b1,覆盖的场景远不止“a=0且b=0”这一种。 - 分支匹配的是按位与的结果,不是变量组合:第二个分支的匹配条件是
a & b == 6'd1,只要按位与的结果是1就会命中,比如a=1'b1、b=6'd3时,按位与结果是6'd1,同样会进入第二个分支,但此时b的值是3不是1,和“匹配a=1且b=1”的预期完全不符。
正确写法参考
如果你的预期是精确匹配a和b两个变量的取值组合,不要在控制表达式中使用按位与,应该用位拼接运算符把多个信号合并为一个控制向量,分支项也对应使用常量拼接,实现精确的全位匹配:
reg a; reg [5:0] b; reg c; case({a, b}) // 拼接为7位控制向量,包含a和b的所有位信息 {1'b0, 6'd0}: c <= 1'b1; // 仅当a=0、b=0时命中 {1'b1, 6'd1}: c <= 1'b0; // 仅当a=1、b=1时命中 default: c <= 1'b0; endcase
如果你的需求真的是判断a & b的运算结果值,那可以直接把分支项简化为常量,不需要在分支内重复写按位与运算:
case(a & b) 6'd0: c <= 1'b1; // a和b按位与结果为0时命中 6'd1: c <= 1'b0; // a和b按位与结果为1时命中 default: c <= 1'b0; // 其余按位与结果(2~63)走默认分支 endcase
内容的提问来源于stack exchange,提问作者abunickabhi
相关产品推荐
相关产品推荐

