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

Gra*_*ore 0 verilog

我正在尝试使用“?” 在我的案例陈述中不关心说明符。我也尝试过使用 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)

Ser*_*rge 5

还有在Verilog中3个不同的case语句:case,casex,和casez。他们对待不关心的方式不同。

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

不关心你应该使用casex和casez。两者都进行对称比较,这意味着?与任何内容匹配,但任何内容也与“?”匹配。因此,如果state或in在您的情况下包含 x 或 z ,则可能会出现误报。

casez具有较小的误报池,因为它只匹配 'z',无论 casex 是否匹配 'x' 和 'z'。我建议你使用casez这个原因。