Как получить доступ к атрибутам сигнала VHDL в ModelSim через TCL? - PullRequest
0 голосов
/ 11 ноября 2018

Я разрабатываю процессор в VHDL. Я использую ModelSim для моделирования и тестирования. В скрипте симуляции я загружаю программу из двоичного файла в память команд. Теперь я хочу автоматически проверить, помещается ли программа в память, и прервать симуляцию, если это не так. Поскольку память в основном представляет собой массив std_logic_vectors, все, что мне нужно сделать, - это прочитать соответствующий атрибут сигнала для использования в сравнении. Моя проблема: Как я могу получить доступ к атрибуту сигнала VHDL в TCL внутри ModelSim?

Самое близкое, что я получил на данный момент, это использование команды description:

describe sim/:tb:uut:imem:mem_array

который печатает что-то вроде

# Array(0 to 255) [length 256] of
#   Array(31 downto 0) [length 32] of
#     VHDL standard subtype STD_LOGIC

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

set mem_size [get_attribute sim/:tb:uut:imem:mem_array'length]

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

Я был бы очень признателен, если бы опытный пользователь ModelSim помог мне.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Итак, я действительно нашел простое решение. Хотя дальнейшее изучение справочника команд выявило, что можно получить доступ только к нескольким специальным атрибутам сигнала и length не является одним из них, я заметил, что ModelSim автоматически добавляет объект размера в свою базу данных объектов для массива памяти. , Так что я могу легко использовать

set ms [examine sim/:tb:uut:imem:mem_array_size]

чтобы получить размер и затем проверить, подходит ли программа. Это просто идеально для меня, элегантно и просто.

0 голосов
/ 12 ноября 2018

Отказ от ответственности: я не эксперт по Tcl, поэтому, возможно, существует более оптимизированное решение.

Существует команда с именем examine, которую можно использовать для получения значения объектов.

Я создал подобный тестовый стенд с массивом 256 x 32, результаты были

VSIM> examine -radix hex sim/:tb:uut:imem:mem_array
# {32'hXXXXXXXX} {32'hXXXXXXXX} {32'hXXXXXXXX} {32'hXXXXXXXX} {32'hXXXXXXXX} ...

Это значение sim/:tb:uut:imem:mem_array на последнем этапе моделирования (т.е. now).

Команда возвращает список значений для каждого совпадения (вы можете использовать подстановочные знаки), поэтому в нашем случае это список с одним элементом. Вы можете получить глубину, считая количество возвращаемых элементов:

VSIM> llength [lindex  [examine sim/:tb:uut:imem:mem_array] 0]
# 256

Вы можете получить битовую ширину первого элемента, используя examine -showbase -radix hex, который вернет 32'hFFFFFFFF, где 32'h - часть, которую вы хотите проанализировать. Упаковка что в функцию будет выглядеть как

proc get_bit_width { signal } {
    set first_element [lindex [lindex [examine -radix hex -showbase $signal] 0] 0]
    # Replace everything after 'h, including 'h itself to return only the base
    return [regsub "'h.*" $first_element ""]
}

Надеюсь, это даст некоторые подсказки!

...