Вы явно пытаетесь создать конечный автомат, который полностью поддерживается в Verilog. Просто то, как они кодируют вас, не самый ясный способ сделать это с точки зрения понимания людьми вашего кода, а также очень важно, инструментов синтеза и реализации, реализующих именно то, что вы ищете.
Выспросите, могу ли я быть более точным о том, что плохо или двусмысленно с тем, как дизайн в настоящее время закодирован? Конечно. Утверждение @ (поставлено clk);используется в строке, чтобы остановить выполнение текущего кода до тех пор, пока часы не перейдут с низкого уровня на высокий после выполнения предыдущих операторов. В симуляторе или с-программе это возможно;Вы бы приостановили процесс, который реализует этот блок всегда. Далее инструмент (как-то как) устроит так, что код больше не активирует его, когда происходит событие в исходном списке чувствительности "Always @ (read или rst)";но теперь возобновите процесс, когда наступят часы установленного события.
Для того, чтобы инструмент синтеза реализовал это, ему пришлось бы построить логику, которая иногда ищет чтение и первое, а другое время ищет изменение тактовой частоты от 0 до 1;и отслеживать, когда делать какую деятельность. Или, повторюсь, потребуется создать конечный автомат для реализации вашего стиля кодирования (который затем создает другой конечный автомат!). Хотя все возможно, компромисс был достигнут.
Первоначальные авторы инструментов синтеза встретились с оригинальными кодировщиками симуляторов Verilog и разработчиками логики и заключили сделку (IEEE Std 1364.1 - Синтез уровня передачи регистра Verilog) определить, какие конструкции было бы легко кодировать людям, эффективно выполнять на симуляторах и просто для инструментов синтеза - создавать логику, которая выполнялась в точности так, как выполнялись симуляторы.
Следуя этому руководству,гораздо лучше для вас описать конечный автомат, который вы хотите, таким образом, чтобы иметь четкую методологию реализации аппаратного обеспечения.
Конечный автомат имеет конструкцию, которая поддерживает регистр, в котором хранится значение текущего состояния, а затем отдельно логику, котораявычисляет значение следующего состояния на основе текущего состояния и входных данных для модуля. (См. Машину Мили в литературе, например, в Википедии, в качестве альтернативы см. Машину Мура)
Исходя из анализа вашего кода, типичный конечный автомат Мили будет выглядеть так:
module sm (/*AUTOARG*/
// Outputs
data,
// Inputs
address, clk, read, rst
) ;
input clk;
input rst;
input read;
input [8:0] address
output [31:0] data;
reg [31:0] mem[256]
// State registers for state
reg [2:0] state, next_state;
parameter idle_state = 0, read_state = 1;
// State FF for state
always @ ( posedge clk or rst ) begin
if ( rst ) state = idle_state; else
state = next_state;
end
// Next State Logic for state
always @ ( /*AUTOSENSE*/ /*memory or*/ addr_in or idle_state
or read or read_state or state) begin
case (state)
idle_state: begin
if (read) begin
address = addr_in;
next_state = read_state;
end
end
read_state: begin
data = mem[address];
next_state = idle_state;
end
endcase // case (cmd)
end // always @ (...
endmodule // sm