nckkm 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 (изменено) · Жалоба Споткнулся на ерунде, не могу разобраться. Хочу сделать на 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: Изменено 17 ноября, 2010 пользователем nckkm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба сделайте, плз, скриншот циклограммы (вэйф-формы), а то об табличные данные не хо ум ломать. а то он и так не нульцевый :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба а то об табличные данные не хо ум ломать. а не все ли равно ? %) глюк то на виду у всех. Стандартная верификационная Verilog Gotcha, ибо негоже пользоваться задержками, для моделирования логики синхронной Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nckkm 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба а не все ли равно ? %) глюк то на виду у всех. Стандартная верификационная Verilog Gotcha, ибо негоже пользоваться задержками, для моделирования логики синхронной подскажите пожалуйста, а как нужно написать? Глюк, конечно у всех на виду, но только не у меня.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба подскажите пожалуйста, а как нужно написать? Глюк, конечно у всех на виду, но только не у меня.. синхронизируйте запись по фронтам клока Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexus.mephi 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба подскажите пожалуйста, а как нужно написать? Глюк, конечно у всех на виду, но только не у меня.. Примерно так: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба Нужно, чтобы фронты синхросигналов не совпадали с моментом изменения данных. Аналогичным образом ведет себя Quartus при функциональном моделировании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба а не все ли равно ? %) глюк то на виду у всех. вот я ещё глазки свои ломать буду - высматривать в простыне на полтора экрана, каким периодом клок тактируется и в какие времена события запускаются - мне складывать задержки лень, мне даже сорс читать лень (код неформатированный, а стэк-машина в голове не казённая), поэтому и попросил график. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nckkm 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба вот я ещё глазки свои ломать буду - высматривать в простыне на полтора экрана, каким периодом клок тактируется и в какие времена события запускаются - мне складывать задержки лень, мне даже сорс читать лень (код неформатированный, а стэк-машина в голове не казённая), поэтому и попросил график. я в общем разобрался. Сделал в тестбенче установку сигнала 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 одинаково полезны? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба Имхо все это странно. ничего странного. у любого моделистского языка есть своя модель событий. кратко - модельное и смоделированное физическое время - это разные вещи. см. Scheduling Semantic (или как она там) ((есть в стандарте)). то что выглядит как-будто случается в единый момент эмулированного физического времени не происходит на самом деле в единый момент модельного времени. в общем советую сначала почитать что-нибудь о модели событий в HDL. как правило с этого начинается любая книжка по этим языкам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 ноября, 2010 Опубликовано 18 ноября, 2010 · Жалоба Во втором случае я пробовал сделать так: always @(posedge clk) begin if($time==90) wr <= 1'b1; else wr <= 1'b0; end вот именно так лучше не делать никогда %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nckkm 0 18 ноября, 2010 Опубликовано 18 ноября, 2010 (изменено) · Жалоба вот именно так лучше не делать никогда %) Огромное спасибо Вам за Ваши содержательные ответы! Вы мне очень помогли и я уже во всем разобрался! ничего странного. у любого моделистского языка есть своя модель событий. кратко - модельное и смоделированное физическое время - это разные вещи. см. Scheduling Semantic (или как она там) ((есть в стандарте)). то что выглядит как-будто случается в единый момент эмулированного физического времени не происходит на самом деле в единый момент модельного времени. в общем советую сначала почитать что-нибудь о модели событий в HDL. как правило с этого начинается любая книжка по этим языкам. Хм.. Сперва Вы просите waveform потому что не охота глаза ломать, а теперь говорите, что все правильно, waveform лучше не смотреть, так как события могут выглядеть как будто случаются в один момент времени и советуете почитать книжки. Как-то не очень логично... Изменено 18 ноября, 2010 пользователем nckkm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 18 ноября, 2010 Опубликовано 18 ноября, 2010 · Жалоба Сперва Вы просите waveform потому что не охота глаза ломать, а теперь говорите, что все правильно, waveform лучше не смотреть, так как события могут выглядеть как будто случаются в один момент времени и советуете почитать книжки. Как-то не очень логично... это для вас странно, потому что вы отталкиваетесь от достаточных условий. а я рассматриваю вейф-форму ещё и сточки зрения необходимой логики. рассуждение от противного - если у вас триггер и зависимое событие произошли видимо в одно физическое время, и тригер спровоцировал зависимое событие, то в модельном времени событие-тригер произошло раньше. логично? хотите дальше обсудить мои методы поиска ошибок в коде или у вас есть какие-нибудь вопросы по моделированию? кстати, вам не понравился мой предыдущий ответ? он не был вам полезен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 ноября, 2010 Опубликовано 18 ноября, 2010 · Жалоба 2 nckkm Рассмотрим ваш первый пример. По событию "фронт clk" проверяется, стоит ли wr. В момент 90 ns он установлен. В этом случае данные записываются, а они уже равны 55. С точки зрения работы триггера это ненормально. Но в компьютере все события моделируются последовательно (процессор-то один ;)), согласно очереди событий. При временнОй симуляции будут учитываться реальные задержки, тогда все просимулируется, как должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 ноября, 2010 Опубликовано 18 ноября, 2010 · Жалоба Огромное спасибо Вам за Ваши содержательные ответы! Сарказм? а что тут непонятного, представьте себе что вам потребуется дернуть сигналом wr не один раз, ну а положим тысячу. Ваши действия? Будете делать множественный if на 1000 веток? %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться