Отладка комбинационных логических циклов в Icarus Verilog

Я использую Icarus verilog для моделирования достаточно сложной конструкции. Я обнаружил, что в некоторых редких случаях моя симуляция «застревает», т.е. часы больше не тикают, и кажется, что ни один из сигналов не меняется. Я подозреваю, что это потому, что у меня где-то в моем дизайне есть цикл комбинационной логики. Проблема, конечно, в том, что я понятия не имею, где.

Есть ли систематический метод отладки этого? Я просто очень внимательно смотрю на код, но не могу добиться прогресса. Мы очень ценим любые предложения по поводу того, что я мог бы попробовать.


person Pramod    schedule 10.05.2012    source источник
comment
Причина в том, что Verilog не предоставляет никаких комбинационных задержек по умолчанию, вы должны явно написать # 5 a = b; чтобы описать, что распространение занимает не мгновенное время.   -  person Brian Cannard    schedule 25.04.2021


Ответы (3)


Когда вы запускаете симуляцию, сделайте дамп файла VCD. Если у вас есть бесконечный цикл, вы увидите, что размер файла VCD продолжает расти без записи нового времени в файл. Время обозначается знаком # в начале строки. Вы сможете определить, какие сигналы меняются, без замедления времени.

person toolic    schedule 10.05.2012
comment
полезно знать эту технологию, помимо использования ступенчатой ​​функции в коммерческих симуляторах. - person Wei Song; 10.05.2012

Оказывается, в Icarus Verilog есть флаг компиляции "-pfileline = 1" для этой конкретной задачи. Запуск vvp с этим включенным флагом выводит на печать огромное количество отладочной информации о том, что именно выполняется.

person Pramod    schedule 12.05.2012

IMO, большую часть времени бесконечные циклы происходят с генерацией часов. Особенно, если вы настроили их для генерации переменных частот. Например, если ваши часы настроены следующим образом:

`timescale 1ns / 1ns
 real period;
 reg clk;

 initial begin
     period = 5.0;
     clk = 1'b0;
     forever begin
         #(period/2) clk = !clk;
     end
end

Если вы измените period, то могут возникнуть бесконечные циклы, если вы случайно измените period на 0,0.

Еще сложнее, иногда period / 2 может выходить за рамки вашей точности шкалы времени. Например, если вы установите period = 1.0, тогда period / 2 будет 0,5, а поскольку ваша точность времени составляет 1 нс, это будет привязано к 0, вызывая бесконечные циклы. Если я подозреваю это, я обычно ставлю охрану прямо перед тем, как уйти в отсрочку (опять же, осторожно и точно ...).

...
half_period_ns = period_ns / 2.0; 
if( half_period_ns == 0 )
    half_period_ns = 1;
#(half_period_ns) clk = !clk;
...

Еще нужно запустить симуляцию в интерактивном режиме и случайным образом нажать Ctrl-C, ввести команду, чтобы спросить симулятор, где он находится (к сожалению, специфичный для симулятора, но в Incisive это where, я думаю) и возобновить симуляцию. Сделайте это несколько раз, и вы поймете, что код занимает все время симулятора.

person Marty    schedule 10.05.2012