Всегда блокировка с заданным срабатыванием как-то работает во время 0 - PullRequest
2 голосов
/ 18 апреля 2020

Я написал базовый 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.

1 Ответ

2 голосов
/ 18 апреля 2020

В тестовом стенде CLK объявлено как reg, а начальное значение reg равно x. Затем вы присваиваете ему значение 1. Поскольку переход x к 1 является постановкой, запускается всегда блок, и выполняется предложение else, увеличивая total_time0.

...