#verilog #hdl #test-bench
#verilog #hdl #тестовый стенд
Вопрос:
Я хочу написать код поведенческого уровня для декодера 2-4, используя цикл for в Verilog. Это то, что я пробовал, но, похоже, я всегда получаю результат как 0:
module decoder2x4Beh(a,e,q);
input e;
input [1:0]a;
output reg [3:0]q;
integer int_a,i;
always @(a) int_a = a;
initial begin
if(e) begin
for(i=0;i<4;i=i 1) begin
if(int_a==i)begin
q[i] = 1'b1;
end
end
end
else q=4'b0;
end
endmodule
Это мой тестовый стенд:
module testDecoder2x4();
reg e;
reg [1:0]a;
wire [3:0]q;
//decoder3x8 dec1(.d(d),.y(y));
//decoder2x4_df dec2(.a(a),.e(e),.q(q));
decoder2x4Beh dec3(.a(a),.e(e),.q(q));
integer k;
initial
begin
{e,a} = 3'b0;
$monitor($time," enable %b input code = %b output q3 %b q2 %b q1 %b q0 %b",e,a,q[3],q[2],q[1],q[0]);
for(k=0;k<16;k=k 1)
begin
#10 {e,a} = k;
end
end
initial
#120 $stop;
endmodule
Ответ №1:
У вас есть несколько проблем:
- ваш код действия в decoder2x4Beh выполняется только один раз за время 0, потому что вы вставляете в
initial
блок. Вместо этого он должен быть частьюalways
блока. Например
always @* begin
if(e) begin
for(i=0;i<4;i=i 1) begin
if(int_a==i)begin
q[i] = 1'b1;
end
end
end
else
q=4'b0;
end
-
{e,a} = k, установит enable только для некоторых последовательностей. Я думаю, что вы должны обеспечить сброс в начале tb, а затем подтвердить ‘e’ в процессе моделирования.
-
Вам лучше использовать
always @*
, чтобы избежать проблем с неполными списками чувствительности. -
Вы должны начать использовать часы в своем дизайне.
-
Хороший отступ поможет прочитать вашу программу.
Ответ №2:
В decoder2x4Beh
, изменить:
initial begin
Для:
always @* begin
intital
Блок выполняется только один раз в момент времени 0, но вы хотите, чтобы блок выполнялся всякий раз, когда происходит изменение любого из его входных сигналов.
Это результат, который я получаю, показывающий q
изменение:
0 enable 0 input code = 00 output q3 0 q2 0 q1 0 q0 0
20 enable 0 input code = 01 output q3 0 q2 0 q1 0 q0 0
30 enable 0 input code = 10 output q3 0 q2 0 q1 0 q0 0
40 enable 0 input code = 11 output q3 0 q2 0 q1 0 q0 0
50 enable 1 input code = 00 output q3 1 q2 0 q1 0 q0 1
60 enable 1 input code = 01 output q3 1 q2 0 q1 1 q0 1
70 enable 1 input code = 10 output q3 1 q2 1 q1 1 q0 1
80 enable 1 input code = 11 output q3 1 q2 1 q1 1 q0 1
90 enable 0 input code = 00 output q3 0 q2 0 q1 0 q0 0
100 enable 0 input code = 01 output q3 0 q2 0 q1 0 q0 0
110 enable 0 input code = 10 output q3 0 q2 0 q1 0 q0 0