Я новичок в верилоге. Пишу декодер 3-8 и тестбенч для него. Это 38_decoder_tb.v
:
module decoder_38(input [2:0] in, output reg [7:0] out);
always @* begin
case (in) //Switch based on concatenation of control signals
3'b000 : out = 8'b00000001;
3'b001 : out = 8'b00000010;
3'b010 : out = 8'b00000100;
3'b011 : out = 8'b00001000;
3'b100 : out = 8'b00010000;
3'b101 : out = 8'b00100000;
3'b110 : out = 8'b01000000;
3'b111 : out = 8'b10000000;
endcase
end
endmodule
Это 38_decoder_tb.v
:
`timescale 1ns / 1ns
module tb_decoder_38;
// decoder_38 Parameters
parameter PERIOD = 20;
// decoder_38 Inputs
reg [2:0] in ;
// decoder_38 Outputs
wire [7:0] out ;
reg clk;
integer i;
initial
begin
clk = 0;
forever #(PERIOD/2) clk=~clk;
end
decoder_38 u_decoder_38 (
.in ( in [2:0] ),
.out ( out [7:0] )
);
initial
begin
in = 0;
#(PERIOD*2);
for (i = 3'd0; i < 3'd8; i=i+1) begin
in = i;
#PERIOD;
end
end
endmodule
Я стимулирую модуль тестового стенда с помощью ModelSim 10.5. Как видите, сигнал просто не обновляется. В чем проблема? Это как-то связано с циклом for?
@sharvian Спасибо. После того, как я исправил эту ошибку, он все еще не работает.
@sharvian Извините, я ошибся. Я только перекомпилировал файл тестбенча, так что волна не изменилась. Но если я скомпилирую все, все работает нормально.
Опубликованный тестовый стенд имеет бесконечный цикл из-за вечного цикла, который ничто не может остановить.
Я добавил задержку #30, чтобы увидеть последние часы данных, и $finish, чтобы остановить их.
После этого код ведет себя так, как ожидалось.
Все 4 симулятора на EDA Playground показывают одно и то же.
initial
begin
in = 0;
#(PERIOD*2);
for (i = 3'd0; i <= 3'd7; i=i+1) begin
in = i;
#PERIOD;
end
//
#30;
$finish;
end
Вот ссылка на игровую площадку, которую я собрал https://www.edaplayground.com/x/aZYL
Спасибо. Ваш код работает нормально. Но если я добавлю $finish
, modelsim просто выйдет. Я предполагаю, что modelsim отличается от iverilog.
Да, проблема в шлейфе.
Ваша проблема в определении 3'd8
. 8
совпадает с 1000
в двоичном представлении и требует 4 бита. Следовательно, 3 бита (как вы просили) дают 000
. В результате ваш цикл вообще не запускается и выглядит следующим образом: for (i = 3'd0; i < 0; i++).
Переменная i
определяется как integer
. Тип integer
— это тип данных с 4 состояниями, 32
-битное целое число со знаком. Итак, переписывание цикла как for(i = 0; i < 8; i++)
решит ваши проблемы. Нет абсолютно никакой необходимости определять размеры констант в этом цикле.
И, чтобы избежать бесконечного цикла, вам нужно использовать $finish, когда это уместно, как это предлагается в другом ответе.
Спасибо. for(i = 0; i < 8; i++)
это решение. Но если я добавлю $finish
, modelsim просто выйдет.
3'd8 превышает 3 бита. Это будет рассматриваться как 0. Вы можете изменить это на 8.