2015-02-25 3 views
1

Проблемысигнала Force от тестбенча

В моей конструкции есть счетчик, который используется для задержки. Для целей моделирования я хотел бы ограничить максимальное значение без редактирования любого производственного кода. Это делается для ускорения моделирования.

То, что я пытался

Я хотел проверить, если он превышает максимальное значение из моего тестбенча, и если он делает, я хотел установить его к этому значению. Моя первая попытка выглядела так:

alias ext_delay is << signal .architecture.in.my.production.code.delay : std_logic_vector(31 downto 0) >>; 
cap_delay : process (ext_delay) is 
    constant max_value : std_logic_vector(31 downto 0) := x"00001000" 
begin 
    if ext_delay > max_value then 
     ext_delay <= max_value; 
    end if: 
end process cap_delay; 

Однако, это вызывает сигнал задержки в архитектуре, чтобы всегда быть 'U', вероятно, так как оно было обусловлено несколькими процессами. Затем я попробовал это, используя ключевое слово force, которое преуспело в изменении значения и не привело к тому, что оно стало 'U', но тогда мне нужно снова его освободить в следующий раз, когда он уменьшится.

+0

Вы пытались использовать 'release' для 'отмены' своей' силы'? Пример [здесь] (https://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_small/#force) –

+0

Я знаю, но я не знаю, как мне это пора. Я не могу выполнить 'ext_delay <= force max_value, освободить после 10 нс;', это не сработает. –

+1

Возможно, вы могли бы обновить вопрос своим кодом, который использует 'force' –

ответ

2

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

alias ext_delay is << signal .architecture.in.my.production.code.delay : std_logic_vector(31 downto 0) >>; 
cap_delay : process is 
    constant max_value : std_logic_vector(31 downto 0) := x"00001000" 
begin 
    wait until ext_delay > max_value then 
     ext_delay <= force max_value; 
    wait for 10 ns; 
     ext_delay <= release; 
end process cap_delay; 
+0

Это, вероятно, должно быть прочитано 'wait until ...;' без 'then' в строке 5, так же как' подождите 10 ns; 'line. – mbschenkel

+0

@mbschenkel, это возможно, не может verfiy это прямо сейчас. –

-1

ли вы использовали NOFORCE ключевое слово, его отпустить значение сигнала

+0

Не 'noforce' - это команда ModelSim TCL? –

+0

Да, попробуйте использовать его сначала из формы сигнала правой кнопкой мыши> noforce – khalil

+0

noForce - команда modelsim, ключевое слово VHDL - 'release'. Я знаю об этом, но я не знаю, как мне это пора. –

1

Существует способ, чтобы определить, если ваш код VHDL выполняется при моделировании или используется для синтеза. Этот код может быть инкапсулирован в функцию, поэтому вы можете проверить его в своем коде VHDL. Например, вы можете определить различные максимальные значения для вашего счетчика.

function SIMULATION return boolean is 
    variable ret : boolean; 
begin 
    ret := false; 
    --synthesis translate_off 
    if Is_X('X') then ret := true; end if; 
    --synthesis translate_on 
    return ret; 
end function; 

В дополнение к этому ап если-то-иначе функция полезна, чтобы выбрать различные значения в постоянном объявлении:

function ite(cond : BOOLEAN; value1 : INTEGER; value2 : INTEGER) return INTEGER is 
begin 
    if cond then 
    return value1; 
    else 
    return value2; 
    end if; 
end function; 

Пример счетчика:

signal Counter_us : UNSIGNED(23 downto 0) := (others => '0'); 

[...] 

process(Clock) 
    constant COUNTER_MAX : POSITIVE := ite(SIMULATION, 100, 10000); 
begin 
    if rising_edge(Clock) then 
    if (Counter_us >= COUNTER_MAX) then 
     Counter_us <= (others => '0'); 
    else 
     Counter_us <= Counter_us + 1; 
    end if; 
    end if; 
end process; 

Для получения дополнительной функции, как SIMULATION и ite (..) загляните в пакет PoC.utils.

+1

Да, но, как я уже сказал, я не хочу редактировать какой-либо производственный код, так как это потребует повторной передачи его частей, которые уже находятся в ветви релиза. Я отправил решение, с которым я пошел. –

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