Прочетох „Неблокиращи присвоявания в синтеза на Verilog, стилове на кодиране, които убиват!“ от Клифърд Къмингс. Той казва, че следният код (страница 12, опростена) е правилна реализация на джапанка, често използвана в учебниците, дори и да не е точно този вид, който всеки трябва да използва. документът спечели награда за най-добър документ, така че предполагам, че твърдението е вярно.
module ff (q, d, clk)
output q;
input d, clk;
reg q;
always @(posedge clk)
q = d;
endmodule
Бих искал да знам защо това ще продължи да работи правилно, ако два или повече от тези джапанки са свързани последователно. Казвам
module two_ffs (q, d, clk)
input d, clk;
output q;
wire tmp;
ff firstff (tmp, d, clk);
ff secondff (q, tmp, clk);
endmodule
Според мен е възможно стойността на tmp да се актуализира, преди да бъде използвана от secondff, което води до един тригер, а не два. Може ли някой да ми каже коя част от стандарта казва, че това не може да се случи? Много благодаря.
[не че някога бих си помислил да напиша код по този начин, просто искам да разбера поведението на блокиране/неблокиране дори в случаите, когато лошият стил на кодиране прави смисъла неочевиден]
Добавено по-късно:
Сега мисля, че хартията е малко вероятно да е правилна. Раздел 5 „Семантика на планиране“ на стандарта 1364-2201 Verilog обяснява какво се случва. По-конкретно, раздел 5.6.6 „Връзки на портове“ на страница 68 казва, че еднопосочните портове са точно като непрекъснати присвоявания. На свой ред непрекъснатото присвояване е просто винаги блок, чувствителен към всичко. Така че най-важното е, че двете инстанции на ff в моя пример по-долу са еквивалентни на модул с множество клаузи на always, за които всеки би се съгласил, че е счупен.
Добавено, след като Клайв Къмингс отговори на въпроса:
Благодарен съм на CC, че изтъкна, че твърденията по-горе, взети от раздел 5 на стандарта, се отнасят само до времето на събитията за актуализиране и не предполагат буквална еквивалентност между напр. някои непрекъснати задачи и винаги блокира. Въпреки това мисля, че те обясняват защо някои симулатори (напр. Icarus Verilog) ще произведат различни резултати от симулация с блокиращо и неблокиращо задание във "тригера". [В по-голям пример получих 2 очевидни ffs с блокиращо задание и правилните пет с неблокиращо.] Други симулатори (напр. Modelsim с опции по подразбиране или Cver) изглежда дават същия резултат, без значение коя форма на се използва присвояване.
Тъп въпрос: Вашият модел всъщност се казва DataModel?
- person Tim   schedule 26.06.2012