2012-05-10 2 views
3

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

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

ответ

3

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

+1

Полезно знать эту технологию, кроме того, используя функцию шага в коммерческих симуляторах. –

+0

Спасибо за ответ, но время моделирования для меня не продвигается. После последнего #

+0

Вы смотрите на файл VCD, пока симуляция все еще работает? – toolic

0

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, а так как ваша точность времени равна 1ns, это будет привязано к 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 я думаю) , и возобновить сим. Сделайте это несколько раз, и вы сможете получить представление о том, что код занимает все время симулятора.

1

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