Почему не работает ===, когда я немного сравниваю с 1'bx в iverilog? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь настроить свой тестовый стенд для iverilog так, чтобы всякий раз, когда какой-либо бит ошибки был установлен на «x», модуль устанавливал некоторую строку с именем «state_string» на «START» и устанавливал «state_string» на другой значение, когда бит ошибки равен 1'b0 или 1'b1.

Я пытался использовать casex для этого, и я проанализировал его с помощью средства просмотра формы волны, но я все еще несколько озадачен тем, что здесь происходит за кулисами. Вот форма волны, которую я вижу ...

Форма волны

Я ожидаю, что всякий раз, когда ошибка равна «x», «state_string» не будет серией x.

Кроме того, вот код внутри моего тестового стенда, который должен контролировать это поведение ...

always @(*) begin
  if (error === 1'bx) begin
    state_string = "START";
  end
  if (error === 1'b0) begin
    state_string = "RUNNING";
  end
  if (error === 1'b1) begin
    state_string = "ERROR";
  end
end

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

1 Ответ

1 голос
/ 19 апреля 2019

У вас есть симулятор, управляемый событиями.Для срабатывания always ( * ) один из сигналов должен быть изменен.Ваш error имеет начальное состояние 'x', поэтому он не меняет .

Попробуйте:

initial
begin
    #100;
    error = 1'b0;
    #100;
    error = 1'b1;
    #100;
    error = 1'bx;
    #100
end

И вы получите это: enter image description here

...