我刚开始学习一些verilog并遇到了一个问题,通常可以使用其他语言的for循环来解决。
s2 s1 s0 m
0 0 0 u
0 0 1 v
0 1 0 w
0 1 1 x
1 0 0 y
1 0 1 z
这是问题的真值表,其中s2,s1,s0是开关,(u,v,w,x,y,z)是输入,如果设置了某些开关,则输出(m)将被设置作为投入之一。但是,这只有1位宽,我们可以将每个m指定为以下输入之一,前提是s0,s1,s2匹配。如果它是3位宽的输入和输出ex:(u0,u1,u2),(m0,m1,m2)但每个变量仍然遵循相同的逻辑(例如:u0,u1,u2都将是输出m0,m1,m2假设所有开关都是0)我如何缩短我的代码。我允许这样做:
assign m[3:0] = (~s0&~s1&~s2&u[3:0])
答案 0 :(得分:0)
不,这不是一个好的解决方案。在执行&
操作之前,Verilog会将您的选择信号扩展为与m相同的宽度,默认行为是在左侧添加零以扩展信号。如果您声明选择信号已签名,它可能会有效,但我认为您可以做得更好。
此外,您提供的示例仅处理您的真值表的第一行。对于s0
,s1
和s2
的其他七种组合,您将全部为零分配给m
。如果你想在一个组合分配中执行此操作,那么你需要8个逻辑表达式,就像你拥有的那样,所有ORed一起得到最终结果。
更简洁的方法是使用if-then-else
块内的case
或always
语句。
答案 1 :(得分:0)
尝试一个案例陈述:
always @* begin
case ({s2,s1,s0})
3'b000 : m = u;
3'b001 : m = v;
3'b010 : m = w;
3'b011 : m = x;
3'b100 : m = y;
3'b101 : m = z;
default: m = 0; /* <-- catch all */
endcase
end
注意:如果真值表不完整,请使用default
。否则将推断出锁存器。