"?" безразлично значение в заявлении case - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь использовать "?" не волнует спецификатор в моем заявлении case. Я также пробовал использовать 6'b0001xx и 6'b0001zz. Я смущен, поскольку я сослался на прототипирование ПЛИС Понг Чу на примерах Verilog, и, похоже, он делает это точно так же. Когда я запускаю симуляцию, когда «состояние» равно 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

1 Ответ

5 голосов
/ 07 мая 2020

в verilog есть 3 разных оператора case: case, casex и casez. Они различаются тем, как они обращаются с безразличием. Причина в том, что он реализует оператор === для сравнения условий. Таким образом, он точно сопоставляет x с x и z с z.

Неважно, вы должны использовать casex и casez. Оба выполняют симметричное сравнение, что означает, что ? соответствует чему угодно, но все также сопоставляется с '?'. Итак, могут быть ложные срабатывания, если state или in в вашем случае содержат x или z.

casez имеет меньший пул ложных срабатываний, поскольку он соответствует только 'z', независимо от того, соответствует ли casex обоим, 'x' и 'z'. Я предлагаю вам использовать casez по этой причине.

...