我正在尝试使用“?” 在我的案例陈述中不关心说明符。我也尝试过使用 6'b0001xx 和 6'b0001zz。我很困惑,因为我通过 Verilog 示例引用了 Pong Chu 的 FPGA 原型设计,而且他似乎以完全相同的方式执行此操作。当我运行模拟时,当“state”为 0 且“in”为 4 (3'b100) 时,case 语句变为默认值,而不是预期的第一个 case (6'b0001??)。如果有人可以解释或指出我正确的方向,将不胜感激。
always @(*)
begin
case({state, in})
//state0, start is high >> loadA = 1 (s1)
6'b0001??: {nstate, nout} = {3'b001, {1'b0, 1'b1, 1'b0, pass}};
//state1, start is high >> loadD = 1 (s2)
6'b0011??: {nstate, nout} = {3'b010, {1'b0, 1'b0, 1'b1, pass}};
//state2, start is high >> we = 1 (s3)
6'b0101??: {nstate, nout} = {3'b011, {1'b1, 1'b0, 1'b0, pass}};
//state3, done is high >> loadA = 1 (s4), done is low >> loadA = 1 (s1)
6'b01111?: {nstate, nout} = {3'b100, {1'b0, 1'b1, 1'b0, pass}};
6'b0111??: {nstate, nout} = {3'b001, {1'b0, 1'b1, 1'b0, pass}};
//state4, start is high >> loadD = 1 (s5)
6'b1001??: {nstate, nout} = {3'b101, {1'b0, 1'b0, 1'b1, pass}};
//state5, start is high >> (s6)
6'b1011??: nstate = 3'b110;
//state6, done is low >> loadA = 1 (s4), done is high >> (s7)
6'b1101??: {nstate, nout} = {3'b100, {1'b0, 1'b1, 1'b0, pass}};
6'b11011?: nstate = 3'b111;
//state7, finish is low >> increment pass, loadA = 1 (s1), finsih is high >> pass = 0 loadA = 1 (s1)
6'b1111??: {nstate, nout} = {3'b001, {1'b0, 1'b0, 1'b0, (pass+1)}};
6'b1111?1: {nstate, nout} = {3'b001, {1'b0, 1'b0, 1'b0, 3'b0}};
default:
{nstate, nout} = {3'b0, 6'b0};
endcase
Run Code Online (Sandbox Code Playgroud)
还有在Verilog中3个不同的case语句:case,casex,和casez。他们对待不关心的方式不同。
一般来说,case不应该有不关心,它的行为在不关心的情况下是不可合成的。原因是它确实实现了===运算符来比较条件。因此,它完全匹配 x 到 x 和 z 到 z。
不关心你应该使用casex和casez。两者都进行对称比较,这意味着?与任何内容匹配,但任何内容也与“?”匹配。因此,如果state或in在您的情况下包含 x 或 z ,则可能会出现误报。
casez具有较小的误报池,因为它只匹配 'z',无论 casex 是否匹配 'x' 和 'z'。我建议你使用casez这个原因。