2015-10-08 4 views
1

Я пытаюсь объединить параметр и модуль и два числа и вернуть результат. Однако, похоже, у меня проблемы. Мой код выглядит следующим образом:verilog и выходы модуля z's

module main; 
    reg signed [3:0] x; 
    reg signed [3:0] y; 
    wire [3:0] out1; 
    ander #(.L1(4)) andd(.in1(x), .in2(y), .out(out1)); 

    initial begin 
     x = 4'b0111; 
     y = 4'b1110; 
     $display("%b", out1); 
     $finish; 
    end 
endmodule 

module ander  #(parameter L1 = 8) 

        (input [L1-1:0] in1, 
         input [L1-1:0] in2, 
         output wire [L1-1:0] out); 

     assign out = in2&in1; 
endmodule 

Когда я пытаюсь запустить это, выход «zzzz». Я делаю что-то неправильно?

, когда я изменить его на

$display("%b", x&y); 

, кажется, чтобы показать просто отлично.

любые рекомендации? веселит

ответ

1

Если вы хотите детерминированный вывод, добавить некоторую задержку, прежде чем ваш $display:

initial begin 
     x = 4'b0111; 
     y = 4'b1110; 
     #1; 
     $display("%b", out1); 
     $finish; 
    end 

Печатается 0110.

+1

Perfect. Спасибо, никогда бы не подумал об этом ... –

+0

Чтобы избежать условий гонки, '$ strobe' также может быть полезен. – sharvil111

2

Добавить небольшую задержку перед $display

initial begin 
    x = 4'b0111; 
    y = 4'b1110; 
    #1; // <-- Add a little delay 
    $display("%b", out1); 
    $finish; 
end 

Verilog делает одну операцию в это время. Когда внутри процедурного блока он будет выполнять каждую операцию в блоке до тех пор, пока он не ударит по блокирующему утверждению или не завершится. В вашем случае заявление assign не успело отреагировать на изменения в x и y перед начальным блоком с именем $display и $finish.

Смежные вопросы