Значение по умолчанию для недоступных состояний в FSM - PullRequest
1 голос
/ 07 мая 2019

У меня конечный автомат с 3 состояниями. Каждое состояние имеет определенные выходные значения, связанные с ним. Во время синтеза я получаю предупреждение, если я не назначаю выходы в 4-м состоянии. Переход в 4-е состояние отсутствует, поэтому он недоступен. Какие выходы я должен назначить в 4-м состоянии?

Я видел пример в интернете, где им присвоили «Неизвестное значение». Это улучшает производительность? Это опасно в каком-то смысле?

reg [1:0] state;
reg [7:0] out;

always @(state) begin
    case (state)
        2'b00: out = 8'hAA;
        2'b01: out = 8'hBB;
        2'b10: out = 8'hCC;
        default: out = 8'bxxxx_xxxx;
    endcase
end

1 Ответ

2 голосов
/ 07 мая 2019

Я видел пример в интернете, где им присвоили «Неизвестное значение». Это улучшает производительность? В каком-то смысле это опасно?

Нет, это не опасно. Присвоение неизвестного значения дает инструменту синтеза еще одну степень свободы для оптимизации. Однако важно иметь в виду, что в кремнии не существует неизвестного состояния. Другими словами, инструмент синтеза примет значение во время этого состояния. Единственное, что вы указываете, это то, что вас это не волнует.

Однако назначение неизвестного состояния в вашем коде не является действительно необходимым. Поскольку вас не волнует состояние 2'b11 (поскольку оно недоступно), вы можете просто сделать следующее:

reg [1:0] state;
reg [7:0] out;

always @(state) begin
    case (state)
        2'b00: out = 8'hAA;
        2'b01: out = 8'hBB;
        default: out = 8'hCC;
    endcase
end

Это, вероятно, похоже на то, что будет делать инструмент синтеза.

Пожалуйста, имейте в виду, что, хотя присвоение неизвестного состояния является синтезируемым, сравнение с неизвестным состоянием - нет! Язык описания оборудования Verilog (5-е издание) Томаса и Мурби объясняет на странице 39, каким образом можно использовать неизвестный оператор во время логического синтеза.

...