Изменения значений на основе clk не работают для случайных чисел

Я пишу код, который помещает значение «d» в «z» всякий раз, когда «clk» изменяется на «1».

Например,

clk=0 d=        15, z=         x
clk=1 d=        20, z=        20
clk=0 d=        25, z=        20
clk=1 d=        30, z=        30

он помещает значение «d» в «z» всякий раз, когда clk равен «1».

Итак, ниже приведен код, который повторяет его 20 раз для случайных чисел.

module lab9;
reg [31:0] d;
reg clk, enable, flag;
wire [31:0] z;
reg [31:0] e;
register #(32) mine(z, d, clk, enable);

always begin
#5 clk = ~clk;

end

initial
#1 $monitor("%5d: clk=%b,d=%d,z=%d,expect=%d", $time,clk,d,z, e);

initial begin 
clk=0;
flag = $value$plusargs("enable=%b", enable);

repeat (20) begin
#2 d = $random;
end
$finish; 

end 

endmodule 

И вывод, который я получаю:

    1: clk=0,d=         x,z=         x,expect=         x
    2: clk=0,d= 303379748,z=         x,expect=         x
    4: clk=0,d=3230228097,z=         x,expect=         x
    5: clk=1,d=3230228097,z=3230228097,expect=         x
    6: clk=1,d=2223298057,z=3230228097,expect=         x
    8: clk=1,d=2985317987,z=3230228097,expect=         x
   10: clk=0,d= 112818957,z=3230228097,expect=         x
   12: clk=0,d=1189058957,z=3230228097,expect=         x
   14: clk=0,d=2999092325,z=3230228097,expect=         x
   15: clk=1,d=2999092325,z=2999092325,expect=         x
   16: clk=1,d=2302104082,z=2999092325,expect=         x
   18: clk=1,d=  15983361,z=2999092325,expect=         x
   20: clk=0,d= 114806029,z=2999092325,expect=         x
   22: clk=0,d= 992211318,z=2999092325,expect=         x
   24: clk=0,d= 512609597,z=2999092325,expect=         x
   25: clk=1,d= 512609597,z= 512609597,expect=         x
   26: clk=1,d=1993627629,z= 512609597,expect=         x
   28: clk=1,d=1177417612,z= 512609597,expect=         x
   30: clk=0,d=2097015289,z= 512609597,expect=         x
   32: clk=0,d=3812041926,z= 512609597,expect=         x
   34: clk=0,d=3807872197,z= 512609597,expect=         x
   35: clk=1,d=3807872197,z=3807872197,expect=         x
   36: clk=1,d=3574846122,z=3807872197,expect=         x
   38: clk=1,d=1924134885,z=3807872197,expect=         x
   40: clk=0,d=3151131255,z=3807872197,expect=         x

В строке 6 этого вывода должно быть «2223298057», но все еще иметь значение предыдущего «z», даже если для его clk установлено значение «1».

Как я могу это исправить?


person online.0227    schedule 22.03.2016    source источник
comment
@toolic Я думал, что проблема внутри моего кода, поскольку регистр - это не то, что у меня даже есть, поэтому он как бы предоставляется системой Verilog. поэтому я думаю, что мой код не подходит для правильной работы с регистром.   -  person online.0227    schedule 22.03.2016


Ответы (2)


Судя по поведению результатов, которые вы представили, может показаться, что

register #(32) mine(z, d, clk, enable);

представляет собой набор из 32 триггеров D-типа, который, учитывая его название и названия сигналов, которые вы подключили, также имеет место. Было бы легче ответить на ваш вопрос, если бы вы предоставили код для register.

Итак, если register действительно представляет собой набор из 32 триггеров D-типа, вы не ожидаете, что z изменится в момент времени 6. Ни один тип триггера не ведет себя так: выход триггера изменяется только при один (нарастающий или спадающий) фронт часов.

Учитывая, что эти триггеры D-типа присутствовали до того, как вы начали это упражнение, может показаться, что вы меняете d слишком быстро. Вы должны менять его один раз за тактовый (clk) цикл, т.е. один раз каждые #10. Другими словами, попробуйте изменить

#2 d = $random;

to

#10 d = $random;
person Matthew Taylor    schedule 22.03.2016
comment
странно, у меня нет исходного кода для регистрации. (У меня нет файла с именем register.v в той же папке с этим исходным кодом, а также снаружи) Он просто компилируется и запускается, даже если вывод не тот, который я хотел. - person online.0227; 22.03.2016
comment
@online.0227 Какую полную команду вы используете для компиляции и запуска симуляции? Если вы управляете им из графического интерфейса, команда может быть первой в выводе симулятора. - person Matthew Taylor; 22.03.2016
comment
iverilog -o схема lab9_part2.v && схема vvp +enable=1 - person online.0227; 23.03.2016
comment
Я запускаю это на терминале системы Linux - person online.0227; 23.03.2016
comment
@ online.0227 Спасибо - к сожалению, это не помогает. Я надеялся, что это будет своего рода указанием, где в команде находится код для register. Ну, это почти наверняка набор триггеров, и, учитывая, что вы не писали этот код, это то, что должно быть там? Вы создали экземпляр register или он уже был в файле lab9_part2.v? - person Matthew Taylor; 23.03.2016
comment
Я действительно ничего не делал, кроме исходного кода, который я предоставил выше, и компилировал и запускал его с помощью команды выше на терминале. Я не понимаю смысла того, что вы сказали, создать экземпляр регистра, но я действительно не делал ничего, кроме исходного кода выше. - person online.0227; 23.03.2016
comment
@ online.0227 Я имею в виду: ты набрал строку register #(32) mine(z, d, clk, enable);? Или он уже был в файле до того, как вы начали его редактировать? - person Matthew Taylor; 23.03.2016
comment
да. он уже был там, как вы видите в исходном коде выше. Спасибо. (на самом деле я сам записал это в свой исходный код, когда просматривал руководство. Но я сделал только это. Я не писал ничего, кроме моего исходного кода. - person online.0227; 23.03.2016
comment
@ online.0227 Итак, если эта строка уже была там, то, как я сказал в своем ответе, вы не понимаете поведения триггера D-типа. Казалось бы, вы ожидаете, что он будет вести себя как защелка. Я бы сказал, что вы меняете D слишком быстро; вы должны менять его один раз за тактовый (clk) цикл, т.е. каждые #10. Я обновлю свой ответ, чтобы отразить это. Пожалуйста, оцените это, если вы найдете это полезным. - person Matthew Taylor; 23.03.2016
comment
Хорошо, вы имеете в виду, что я должен поставить #10 перед регистром #(32) mine(z, d, clk, enable); ? инструктор не говорит мне о триггере D-типа, может быть, мне нужно сначала изучить его. Большое тебе спасибо. - person online.0227; 23.03.2016

Ваш реестр уже работает правильно. Регистры запускаются фронтом; нет часового края между временными шагами 5 и 6, поэтому значение z не обновляется.

Если вы хотите, чтобы z постоянно обновлялось, пока часы находятся на высоком уровне, вам нужна защелка, а не регистр. Однако имейте в виду, что временной анализ намного сложнее в конструкциях, включающих защелки, и поэтому их обычно следует избегать.

person Community    schedule 22.03.2016