Сначала о вашем коде.
он не может быть скомпилирован. out
должно быть reg
, чтобы его можно было назначить в блоке always
.
с использованием неблокирующего назначения в out_del <= in & in_del
вызовет задержку в один цикл для сравнения if (out_del)
. Неблокирующие назначения планируют назначение lhs после оценки блока. Основное правило - всегда использовать блокирующие назначения для промежуточных сигналов в последовательном блоке.
из-за вышеизложенного и из-за in & in_del
это не может быть синтезировано или, по крайней мере, не может быть правильно синтезировано.
Вы нарушаете отраслевые практики, используя присвоение blocking
в сигнале out
. Основное правило: всегда использовать неблокирующие назначения для выходов последовательных блоков.
код просто не работает : - (
Если я правильно понял ваше требование, то следующий код сделает это:
module top_module (
input clk,
input reset,
input [31:0] in,
output reg [31:0] out );
reg lock;
always @ (posedge clk)
begin
if (reset) begin
lock <= 0;
out <= 0;
end
else if (lock == 0)
begin
out <= in;
lock <= 1;
end
end
endmodule
Просто используйте сигнал lock
, чтобы разрешить обновление. И да, Вот простой тестовый стенд, чтобы проверить это:
module real_top();
reg clk, reset;
reg [31:0] in;
reg [31:0] out;
top_module tm(clk, reset, in, out);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
integer i;
initial begin
in = 0;
reset = 1;
#7 reset = 0;
for (i = 1; i < 5; i++) begin
#10 in = i;
#10 reset = 1;
#10 reset = 0;
end
$finish;
end
initial
$monitor(clk, reset, in, out);
endmodule