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