“?”不关心 case 语句中的值

"?" don't care value in case statement

我正在尝试使用“?”不要在意我的案例陈述中的说明符。我也尝试过使用 6'b0001xx 和 6'b0001zz。我很困惑,因为我已经通过 Verilog 示例引用了 Pong Chu 的 FPGA 原型制作,而且他似乎以完全相同的方式进行了此操作。当我 运行 模拟时,当 "state" 为 0 且 "in" 为 4 (3'b100) 时,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

verilog 中有 3 种不同的 case 语句:casecasexcasez。他们对待无关紧要的方式不同。

一般来说,case 不应该有 don't care,它的行为在 don't care 的情况下是不可综合的。原因是它确实实现了 === 运算符来比较条件。所以,它完全匹配 x 到 x 和 z 到 z。

如果不关心,您应该使用 casexcasez。两者都做对称比较,意思是 ? 匹配任何东西,但任何东西也匹配 '?'。因此,如果您的 statein 包含 x 或 z,则可能会出现误报。

casez 具有较小的误报池,因为它只匹配 'z',casex 是否匹配 'x' 和 'z'。因此,我建议您使用 casez