Я написал базовый c кусок кода Verilog.
`timescale 1ns / 1ps
module lab3_2(
input[3:0] command,
input CLK,
input mode,
output reg [7:0] total_time1,
output reg [7:0] total_time0
);
initial begin
total_time1 = 8'b00000000;
total_time0 = 8'b00000000;
end
always @(posedge CLK) begin
if(total_time1 == 8'b00000001 && total_time0 == 8'b00001001)
begin
total_time0 <= 8'b00000000;
total_time1 <= 8'b00000000;
end
else if(total_time0 == 8'b00001001)
begin
total_time1 <= 8'b00000001;
total_time0 <= 8'b00000000;
end
else
begin
total_time0 <= total_time0 + 8'b00000001;
end
end
endmodule
Считает время до 20, total_time1
показывает крайний левый ди git и total_time0
показывает крайний правый ди git.
Если total_time1
= 1 и total_time0
= 5, тогда 15-й раз работал блок always
.
Моя проблема в том, что когда я пробую этот тестовый стенд:
`timescale 1ns /1ps
module lab3_2_testbench;
reg[3:0] command;
reg CLK;
reg mode ;
wire[7:0] total_time1;
wire[7:0] total_time0;
lab3_2 uut(
.command(command),
.CLK(CLK),
.mode(mode),
.total_time1(total_time1),
.total_time0(total_time0)
);
initial CLK = 1;
always #5 CLK = ~CLK;
initial begin
$monitor("Time=%t | command=%b mode=%b| total_time1=%b total_time0=%b CLK=%b ", $time, command, mode,total_time1,total_time0,CLK);
mode = 0 ;
command = 4'b0000;
$display("Current simulation time = %t",$time);
#10;
$display("Current simulation time = %t",$time);
$finish;
end
endmodule
В результате я получаю:
Time= 0 | command=0000 mode=0| total_time1=00000000 total_time0=00000001 CLK=1
Time= 5000 | command=0000 mode=0| total_time1=00000000 total_time0=00000001 CLK=0
Current simulation time = 10000
Stopped at time : 10 ns : File "/home/bs04/e2237006/Desktop/liy/testbench_part2.v" Line 35 **
Почему total_time0
равно 1 в момент времени 0? Должно ли это быть не 0? Я думал, что единственный способ увеличить total_time0
- это запустить блок always
, но как мне удалось запустить блок always
в момент времени 0?
Согласно моему коду, CLK
начинается с 1.