2013-11-22 7 views
0

Я использую библиотеку SystemC для создания некоторых модулей для моделирования. SystemC производит симуляции, поэтому необходимо установить timestep (в моем случае 1 мс каждый). Проблема в том, что у меня есть циклическая зависимость между некоторыми функциями и переменными. Звучит глупо, но это лучше, чтобы увидеть кусок кода, чтобы понять:Циркулярная зависимость переменной в C++

FP = 1; 

function drag() 
{ 
    return (a + FP + b); 
} 

function disc() 
{ 
    return (c/drag()); 
} 

function speed() 
{ 
    return (disc()/d); 
} 

Метод выполняется каждый milisecond является:

function process() 
{ 
    double s = speed(); 
    FP = FP + s; 
    cout << FP; 
} 

Как вы можете видеть, существует косвенная зависимость между FP и скорость(). Это возвращает странное значение, и оно всегда одно и то же. Я ожидал, что process() действительно будет выполнен каждые миллисекунды, поэтому у него есть время, чтобы обновить значения до его повторного вызова. Это потому, что это не так? Может быть, это потому, что все установлено во время компиляции? Есть ли способ для double s или Скорость будет «вызываться» только во время выполнения?

Любые идеи были бы очень желанными :) Спасибо!

+2

Кто вызывает процесс() и откуда берутся другие переменные? – ghembo

+0

Все ли используют одну и ту же переменную 'FP'? Я имею в виду, что любые местные жители/'статические 'участвуют? – Angew

+1

Является ли 'process()' предположительно вызываться асинхронно (каждый мс)? Тогда обновление 'FP' без блокировки не будет хорошей идеей. –

ответ

3

Не уверен, что я вижу круговую зависимость, которую вы имеете в виду.

Inline и удаление 's' дает нам следующее: FP: = (c/(A + FP + b))/d + s.

Таким образом, значение используется для расчета самого себя. Как правило, это нормально в большинстве случаев, но это системное зависание?

При моделировании сигналов для ASIC/микросхем/ПЛИС вы никогда не хотите, чтобы сигнал подавался в себя, если он не прошел через защелку/регистр/флип-флоп/другую синхронизированную сущность. Итак, если FP является типом systemC, это может быть как-то исключительным для этого лечения.

В качестве альтернативы, если FP, как предполагается, получает тактику где-то и нет, то он, естественно, сохранит свои старые значения.

+0

Ну, ты прав. Я не понимал, что эта «круговая зависимость» не обязательно верна. Хорошо, поэтому я предполагаю, что это должно быть что-то, что связано с самой симуляцией. Возможно, это не синхронно, и оно перекрывает некоторые значения. Я немного поработаю над этим. Благодаря ;) – makeMonday

0

Похоже, что ваш код является чистым C++. Ничего не вижу, что вы используете SystemC. Возможно, вам следует показать фрагмент кода в SC_CTOR, который, я думаю, управляет процессом или потоком. А как насчет чувствительного списка, который вы задали для этого процесса, который вы назвали.

Смежные вопросы