Перейти к содержанию
    

странный результат симуляции

Споткнулся на ерунде, не могу разобраться.

Хочу сделать на Verilog простой счетчик с возможностью синхронной загрузки вот так:

 

/////////////////////////////////////////////////////

module counter (

input wire reset,

input wire clk,

input wire [7:0]wdata,

input wire wr,

output reg [7:0]data

);

 

 

always @ (posedge clk or posedge reset)

if (reset)

data <= 8'h00;

else

if(wr)

data <= wdata;

else

data <= data + 8'h01;

 

endmodule

 

 

Сделал testbench вот так:

/////////////////////////////////////////////////////

module test_counter;

 

reg reset, clk, wr;

reg [7:0]wdata;

wire [7:0] data_cnt;

 

counter counter_inst(reset, clk, wdata, wr, data_cnt);

 

initial // Clock generator

begin

clk = 0;

forever #10 clk = !clk;

end

 

initial // Test stimulus

begin

reset = 0;

#5 reset = 1;

#4 reset = 0;

end

 

// write into counter

initial

begin

wdata = 8'h00;

#90 wdata = 8'h55;

#20 wdata = 8'h00;

end

 

initial

begin

wr = 1'b0;

#90 wr = 1'b1;

#20 wr = 1'b0;

end

 

initial

$monitor($stime,, reset,, clk,,, wdata,, wr,, data_cnt);

 

endmodule

 

Получаю результат вот такой:

 

0 0 0 0 0 x

5 1 0 0 0 0

9 0 0 0 0 0

10 0 1 0 0 1

20 0 0 0 0 1

30 0 1 0 0 2

40 0 0 0 0 2

50 0 1 0 0 3

60 0 0 0 0 3

70 0 1 0 0 4

80 0 0 0 0 4

90 0 1 85 1 85

100 0 0 85 1 85

110 0 1 0 0 86

120 0 0 0 0 86

130 0 1 0 0 87

140 0 0 0 0 87

150 0 1 0 0 88

 

Не понимаю, как такое может быть!!! Пожалуйста помогите разобраться!

Как может быть, что в момент #90 Я ставлю WR в единицу одновременно с сигналом clk и в регистр уже записывается в этот же момент? Ведь в момент прибытия clk=1 WR только устанавливается!

 

Вот waveform из ModelSim:

36787bc0.png

Изменено пользователем nckkm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сделайте, плз, скриншот циклограммы (вэйф-формы), а то об табличные данные не хо ум ломать. а то он и так не нульцевый :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а то об табличные данные не хо ум ломать.

а не все ли равно ? %) глюк то на виду у всех. Стандартная верификационная Verilog Gotcha, ибо негоже пользоваться задержками, для моделирования логики синхронной

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а не все ли равно ? %) глюк то на виду у всех. Стандартная верификационная Verilog Gotcha, ибо негоже пользоваться задержками, для моделирования логики синхронной

подскажите пожалуйста, а как нужно написать?

Глюк, конечно у всех на виду, но только не у меня..

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите пожалуйста, а как нужно написать?

Глюк, конечно у всех на виду, но только не у меня..

синхронизируйте запись по фронтам клока

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите пожалуйста, а как нужно написать?

Глюк, конечно у всех на виду, но только не у меня..

Примерно так:

initial
begin
    reset = 1;
    wdata = 8'h00;
    wr = 1'b0;
            
    @(posedge clk)
    $display("Let's go!!!");

    // Reset
    reset = 0;
    repeat (5) @(posedge OCP_mclk)
    wdata = 8'h55;
    wr = 1'b1;
    repeat (1) @(posedge OCP_mclk)    
    wr = 1'b0;    
    wdata = 8'h00;
    ...         
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно, чтобы фронты синхросигналов не совпадали с моментом изменения данных.

Аналогичным образом ведет себя Quartus при функциональном моделировании.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а не все ли равно ? %) глюк то на виду у всех.

вот я ещё глазки свои ломать буду - высматривать в простыне на полтора экрана, каким периодом клок тактируется и в какие времена события запускаются - мне складывать задержки лень, мне даже сорс читать лень (код неформатированный, а стэк-машина в голове не казённая), поэтому и попросил график.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот я ещё глазки свои ломать буду - высматривать в простыне на полтора экрана, каким периодом клок тактируется и в какие времена события запускаются - мне складывать задержки лень, мне даже сорс читать лень (код неформатированный, а стэк-машина в голове не казённая), поэтому и попросил график.

 

я в общем разобрался.

Сделал в тестбенче установку сигнала WR по сигналу клока и все заработало (в смысле засимулировалось).

 

НО!!!

Имхо все это странно.

Waveform, который Вы просите и в первом и во втором случае выглядит абсолютно одинаково для сигнала WR и WDATA.

В первом варианте (якобы неправильном) сигнал WR генерировался в тестбенче путем установки в заданное время:

 

initial

begin

wr = 1'b0;

#90 wr = 1'b1;

#20 wr = 1'b0;

end

 

И судя по waveform он действительно устанавливается в момент 90ns

 

Во втором случае я пробовал сделать так:

 

always @(posedge clk)

begin

if($time==90)

wr <= 1'b1;

else

wr <= 1'b0;

end

 

И в этом случае на waveform сигнал WR устанавливается в тот же момент 90ns.

 

Кажется одинаково? а результат симуляции разный.

Получается не все waveform одинаково полезны?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имхо все это странно.

ничего странного. у любого моделистского языка есть своя модель событий. кратко - модельное и смоделированное физическое время - это разные вещи. см. Scheduling Semantic (или как она там) ((есть в стандарте)). то что выглядит как-будто случается в единый момент эмулированного физического времени не происходит на самом деле в единый момент модельного времени. в общем советую сначала почитать что-нибудь о модели событий в HDL. как правило с этого начинается любая книжка по этим языкам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во втором случае я пробовал сделать так:

 

always @(posedge clk)

begin

if($time==90)

wr <= 1'b1;

else

wr <= 1'b0;

end

вот именно так лучше не делать никогда %)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот именно так лучше не делать никогда %)

Огромное спасибо Вам за Ваши содержательные ответы!

Вы мне очень помогли и я уже во всем разобрался!

 

ничего странного. у любого моделистского языка есть своя модель событий. кратко - модельное и смоделированное физическое время - это разные вещи. см. Scheduling Semantic (или как она там) ((есть в стандарте)). то что выглядит как-будто случается в единый момент эмулированного физического времени не происходит на самом деле в единый момент модельного времени. в общем советую сначала почитать что-нибудь о модели событий в HDL. как правило с этого начинается любая книжка по этим языкам.

 

Хм..

Сперва Вы просите waveform потому что не охота глаза ломать, а теперь говорите, что все правильно, waveform лучше не смотреть, так как события могут выглядеть как будто случаются в один момент времени и советуете почитать книжки. Как-то не очень логично...

Изменено пользователем nckkm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сперва Вы просите waveform потому что не охота глаза ломать, а теперь говорите, что все правильно, waveform лучше не смотреть, так как события могут выглядеть как будто случаются в один момент времени и советуете почитать книжки. Как-то не очень логично...

это для вас странно, потому что вы отталкиваетесь от достаточных условий. а я рассматриваю вейф-форму ещё и сточки зрения необходимой логики. рассуждение от противного - если у вас триггер и зависимое событие произошли видимо в одно физическое время, и тригер спровоцировал зависимое событие, то в модельном времени событие-тригер произошло раньше. логично?

хотите дальше обсудить мои методы поиска ошибок в коде или у вас есть какие-нибудь вопросы по моделированию?

кстати, вам не понравился мой предыдущий ответ? он не был вам полезен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 nckkm

Рассмотрим ваш первый пример.

По событию "фронт clk" проверяется, стоит ли wr. В момент 90 ns он установлен. В этом случае данные записываются, а они уже равны 55.

 

С точки зрения работы триггера это ненормально. Но в компьютере все события моделируются последовательно (процессор-то один ;)), согласно очереди событий.

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огромное спасибо Вам за Ваши содержательные ответы!

Сарказм? а что тут непонятного, представьте себе что вам потребуется дернуть сигналом wr не один раз, ну а положим тысячу. Ваши действия? Будете делать множественный if на 1000 веток? %)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...