Перейти к содержанию

    

Особенности ModelSim

Добрый день. В очередной раз пытаюсь «пересеть» на ModelSim, и уже вроде пошёл процесс, но как-то всё весьма своеобразно. Уже закрыл глаза на убогийсвоеобразный и постоянно «прыгающий» GUI. И пока лишь только настораживают не столь уж редкие подвисания/вылеты без явных вроде причин.

Сейчас больше интересует непосредственно основной функционал моделсима, то бишь симуляция/верификация. Пытаюсь максимально всё делать через консоль и скриптами. Со «стандартными» командами (типа vcom, vsim и т.п.) всё очевидно - есть документация, примеры. Но в то же время есть ещё, скажем так, «второстепенные» команды, с которыми не всё так понятно. Как правило, это команды в формате CamelCase с более длинными названиями. Для примера, при экспорте wavefrom в файле wave.do появляются такие команды как WaveActivateNextPane, TreeUpdate, WaveRestoreCursors и т.п. И вот как именно с этими «второстепенными» командами работать не совсем понятно. В лучшем случае они мимоходом упоминаются в доках, но лишь поверхностно. В худшем и поисковики не выдают ничего вразумительного.

 

Да, с одной стороны «общее назначение» команды можно уловить исходя из названия. Но, для начала было бы неплохо хотя бы представлять количество таких команд. Например, если набирать в командной строке ModelSim скажем Wave, то в списке подсказанных команд насчиталось 13 штук.

 

Или вот, например команда WaveActivateNextPane. Поначалу не придавал ей внимания. Потом поэкспериментировал и оказалось, что например "WaveActivateNextPane {} 2" добавляет (или активирует уже добавленное) подокно (Wave Pane), т.е. разбивает единое окно wave на несколько подокон. Как раз нужен такой функционал при большом количестве сигналов, а найти это удалось лишь случайно, методом тыка. И пока по-прежнему не понятно, как закрывать эти самые добавленные подокна (panes). В GUI меню есть такое дело (Wave->”Delete Window Pane”), но соответствующей команды найти пока не удалось. А где и как искать неизвестно.

И это кстати не первый пример в ModelSIm, когда какое-то действие можно выполнить в GUI, а прямого аналога команд консоли вроде как нет. И зачастую нет прямого «отражения» (вывода) GUI действий в консоли, что уж совсем странно.

Может, есть какие-то команды, которые посылают события в GUI, имитация нажатия меню/иконок, макросы, хуки, …?

 

Ещё, не всегда понятно как интерпретировать вывод стандартных/второстепенных команд. Например, команда view выдаёт список открытых окон типа такого

>view
# .main_pane.objects .main_pane.source .main_pane.structure .main_pane.transcript .main_pane.wave .main_pane.process .main_pane.library .main_pane.memory .main_pane.project

Тут ещё более менее понятно из названий. Но скажем, когда глубина элементов увеличивается, уже малопонятно. Та же команда WaveActivateNextPane может выдать что-то такое:

.main_pane.wave.interior.cs.body.pw.wf.tree.tree1

Откуда вообще эта структура, как вообще устроена вся эта иерархия? И насколько вообще нужно/желательно её знать понимать (опять таки для управления через командную строку)? С одной стороны это представляет больше академический интерес. Но из-за определённой кривости ModelSim приходится ковыряться в этих дебрях.

Опять-таки, в качестве примера, можно привести вот эту тему: "Как сделать главное окно Modelsim при старте во весь экран?". Решение, подсказанное RobFPGA, выглядит так:

wm state . zoomed

Вот только откуда всё это? В документации ModelSim этого нет. Судя по всему, это уже имеет отношение к Tcl/Tk, на котором вроде построен ModelSim?

 

Пожалуй хватит для начала для одного сообщения :). Хотелось бы услышать мнения общества по этому поводу.

И может заодно ответы на пару конкретных вопросов:

1) Есть ли где-то какой-то список/документация на «второстепенные» команды (API)?

2) Может есть команды «имитации» событий GUI (нажатия меню/иконок)?

3) Какой командой можно закрыть подокно (Wave Pane), открытое командой "WaveActivateNextPane {} 2" (без закрытия переоткрытия всего кона Wave)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Пожалуй хватит для начала для одного сообщения :). Хотелось бы услышать мнения общества по этому поводу.

И может заодно ответы на пару конкретных вопросов:

1) Есть ли где-то какой-то список/документация на «второстепенные» команды (API)?

2) Может есть команды «имитации» событий GUI (нажатия меню/иконок)?

3) Какой командой можно закрыть подокно (Wave Pane), открытое командой "WaveActivateNextPane {} 2" (без закрытия переоткрытия всего кона Wave)?

Вынужден спросить - зачем автоматизировать работу с GUI? Какой от этого выигрыш? Я бы посоветовал сменить принципы отладки и тестирования своих проектов, раз возникли такие вопросы, просто подозреваю недопонимание принципов тестирования и назначения такого инструмента как Modelsim...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вынужден спросить - зачем автоматизировать работу с GUI? Какой от этого выигрыш?
Ну, начать хотя бы с того, что GUI кривой. Для сравнения, в Active-HDL множество мелких вещей лично мне удобнее/быстрее делать через GUI/hotkeys. Более сложыне уже скриптами. В ModelSim пока даже многие мелкие вещи мне делать иногда проще в командной строке. Та же компиляция файлов, и симуляция ИМХО в ModelSim гораздо удобнее скриптом.

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

 

Я бы посоветовал сменить принципы отладки и тестирования своих проектов, раз возникли такие вопросы, просто подозреваю недопонимание принципов тестирования и назначения такого инструмента как Modelsim...
Можете посоветовать что-то конкретное? В своё время посматривал на всякие OVM и разные другие методы тестирования и автоматизации. Но пока особо не прижилось, т.к. затраты времени на освоение или зависимость от сторонних ресурсов не особо оправдывают себя.
Изменено пользователем Vengin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Cудя по отсутствию комментариев, придётся набивать шишки самому. Э-эх.

 

Вот конкретная проблема. Не могу до конца разобраться со скриптом startup.do. Пытаюсь заставить Modelsim стартовать окно во весь экран (как описано в этой теме).

Создаём файл $MODEL_TECH/startup.do, в котором одна строчка, которая максимизирует окно Моделсима:

wm state . zoomed

В файле modelsim.ini прописываем следующее:

; VSIM Startup command
Startup = do $MODEL_TECH/startup.do

Запускаем Modelsim и видим следующую ошибку:

...
# do $MODEL_TECH/startup.do
can't read "MODEL_TECH": no such variable

Хотя в самом файле modelsim.ini переменнамя $MODEL_TECH фигурирует неоднократно.

 

Попытался сделать через $env(), т.е. в modelsim.ini пишем:

; VSIM Startup command
Startup = do $env(MODEL_TECH)/startup.do

Modelsim успешно запускается, и окно во весь экран. Однако затем, при дальнейше работе в Modelsim проблема всё равно всплывает. Для примера, пытаемся прогнать простейший example входящий в состав моделсима (лежит в папке $MODEL_TECH/../examples/vhdl/io_utils/:

cd ../examples/vhdl/io_utils
source run.do

Скрипт run.do успешно создаёт библиотеку, комплит в ней исходники. Но когда дело доходит до симуляции, и вызывается команда vsim, вываливается ошибка

# Cannot open macro file: (MODEL_TECH)/startup.do

Т.е. непосредственно в самом моделсиме при любом явном вызове команды vsim повторно пытается запуститься скрикт startup.do (видно заново парсится файл modelsim.ini), но при этом почему-то конструкция $env(MODEL_TECH) уже не срабатывает (хотя если написать только $MODEL_TECH/startup.do то сработает, но, как и описывалось выше, будет ошибка при первоначальном запуске Моделсим).

 

Как разорвать этот порочный круг? Можно конечно прописать абсолютный путь к startup.do, но неужто нельзя через относительный с переменной $MODEL_TECH?

P.S.: в аттаче описанный экзампл и полный транскрипт (ошибка на строке 44).

examples.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Cудя по отсутствию комментариев, придётся набивать шишки самому. Э-эх.

...

А то - нам в чужих синяках облом ходить :)

Тут видимо проблемы в контексте запуска vsim. Можно с ними бодаться - а можно и подстроится.

Я обычно держу startup.tcl файл в локальных sim папках проектов. А в нем уже можно сделать ссылку и на глобальный в $::env(MODEL_TECH)/..

 

Хотя вот попробовал задать как и Вы

Startup = source "$::env(MODEL_TECH)/../setup.tcl"

То при запуске на симуляцию vsim действительно ругается НО при этом потом все равно запускает

Error: (vsim-21) Unable to expand "$::env(MODEL_TECH)../setup.tcl".
> execute source of .../Msim64/win64/../setup.tcl

Успехов! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё кстати, как вариант решения проблемы со startup скриптом, можно работать с файлом проекта .mpf (который по структуре во многом копирует modelsim.ini) и в этом файле проекта закоментировать/не использовать VSIM Startup command.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот мой пример как работать с ModelSim: test_msim.rar

Тут и тестовый модуль и тестбенч, и bat-файл для запуска (на Linux тоже работает именно этот же пример, по аналогии bat на bash, только modelsim заменить на vsim в скрипте запуска). Только свои пути прописать и оно полетит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очередная странность. Надо скопмилить vhdl файл с поддержкой 2008 стандарта. Например,

vcom -2008 version.vhd

отрабатывает нормально. В то же время, если параметры для vcom передать через переменную, имеем ошибку:

> set arg "-2008 version.vhd"
> vcom $arg
# Model Technology ModelSim SE-64 vcom 10.5 Compiler 2016.02 Feb 13 2016
# ** Error (suppressible): (vcom-1902) Option "-2008 version.vhd" is either unknown, requires an argument, or was given with a bad argument.
# Use the -help option for complete vcom usage.
# Errors: 1, Warnings: 0

Почему-то при замене переменной возникают "кавычки", которые вводят vcom в ступор. Как это перебороть пока не понимаю.

 

Вообще изначально пытаюсь скомпилить множество файлов используюя опцию vcom (-F | -file | -f) <filename>. Некоторые (не все) файлы нужно скомпилить с поддержкой 2008 стандарта. Т.е. делаю лист файлов с аргументами и без, пишу в файл и этот файл пытаюсь скармливать vcom. Когда индивидуальный аргрумент это имя файла (без доп параметров) - процесс нормальный. Т.е. если есть файл flist.tmp:

functions_pkg.vhd
version.vhd

то vcom -f flist.tmp отрабатывает без проблем. Если же нужно скажем какой-то файл скомпилить с доп аргументом, то всё ломается:

flist2008.tmp:

functions_pkg.vhd
-2008 version.vhd

параметр -2008 как бы "передаётся" первому файлу, а тот выдаёт ошибку

> vcom -f flist2008.tmp
# Model Technology ModelSim SE-64 vcom 10.5 Compiler 2016.02 Feb 13 2016
# Start time: 15:29:09 on Aug 13,2018
# vcom -reportprogress 300 -2008 functions_pkg.vhd 
# -- Loading package STANDARD
# -- Loading package TEXTIO
# -- Loading package std_logic_1164
# -- Loading package MATH_REAL
# -- Compiling package FUNCTIONS_PKG
# -- Loading package std_logic_arith
# ** Error: functions_pkg.vhd(19): Cannot find subprogram "CONV_STD_LOGIC_VECTOR" with corresponding signature.
# -- Loading package STD_LOGIC_UNSIGNED
# ** Error: functions_pkg.vhd(20): Cannot find subprogram "CONV_INTEGER" with corresponding signature.
# ** Error: functions_pkg.vhd(34): VHDL Compiler exiting
# End time: 15:29:09 on Aug 13,2018, Elapsed time: 0:00:00
# Errors: 3, Warnings: 0

Как по человечески это сделать? Пока только нашёл полуобходной вариант: если строка аргумента "составная" вручную разбивать её на индивидуальные элементы и передавать их поотделности, но это ерунда какая-то:

set arg {-2008 version.vhd}
vcom [lindex $arg 0] [lindex $arg 1]; #ok

vcom_2008_example.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Очередная странность. Надо скопмилить vhdl файл с поддержкой 2008 стандарта. ...

В то же время, если параметры для vcom передать через переменную, имеем ошибку:

> set arg "-2008 version.vhd"
> vcom $arg

Это особенность TCL а не MdelSim. Параметром для proc (коими являются vcom/vlog ..) должен быть list аргументов - то есть когда вы пишете vcom -opt1 -opt2 agr2 file1 file2 то на вход vcom поступает vcom

Естественно если задать set arg "-2008 version.vhd" то это будет одна строка которая сама по себе в list не разобьется

тут надо извращаться например так:

vcom [lappend [list [split $arg " "]] version.vhd]

 

Вообще изначально пытаюсь скомпилить множество файлов используюя опцию vcom (-F | -file | -f) <filename>. Некоторые (не все) файлы нужно скомпилить с поддержкой 2008 стандарта. Т.е. делаю лист файлов с аргументами и без, пишу в файл и этот файл пытаюсь скармливать vcom. Когда индивидуальный аргрумент это имя файла (без доп параметров) - процесс нормальный. Т.е. если есть файл flist.tmp:
functions_pkg.vhd
version.vhd

то vcom -f flist.tmp отрабатывает без проблем. Если же нужно скажем какой-то файл скомпилить с доп аргументом, то всё ломается:

Ясный х. пень - Параметры в .f файле применяются все сразу а не по очереди. Поэтому не получится менять опции для отдельных файлов! Делайте отдельные .f файлы с разными параметрами. Ну или пишите свой велосипед для структурирования файлов проекта. У меня когда то был такой трех-колесник:



#{
# {work library} {vlog options} {vcom options} {
# source_file
# }
#}

{
{CoreGen} {+define+GLBL +incdir+$DSN/src/Core/CoreGen} {} {
$DSN/src/Core/CoreGen/*.v
}
{misc} {-sv} {-2008} {
$DSN/src/misc/module1.v
$DSN/src/misc/module2.vhd
}
{work} {} {} {
[file normalize $env(XILINX)/verilog/src/glbl.v]

$DSN/src/top_pq.sv
$DSN/src/top.sv
}
}

# process all .src files
# read next .src file to module_src
...
foreach {lib opt_sv opt_vhd srclist} $module_src{
foreach srcline [split $srclist "\n"] {
set fext [string tolower [file extension $srcline]]
switch $fext {
".v" {...}
".vhd" {...}
...
default { }
}
}
}

 

Удачи! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Параметры в .f файле применяются все сразу а не по очереди.
Да уж, даже мысли такой не было. Как-то этот "параллелизм" боком вылазит.

По поводу всяких извращиней - что-то мне подсказывает что оно того не будет стоить. Имеется пара сотня файлов, и комплитиь нужно смешанно - часть из них с параметрами, а часть нет. А так как для компиляции vhdl важен порядок, то эти отдельные .f файлы может чуть и помогут, но в целом ситуация конечно грустная.

Ладно, благодарю за помощь, будем дальше сражаться. :smile3009:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Да уж, даже мысли такой не было. Как-то этот "параллелизм" боком вылазит.
Это не "параллелизм" это просто другой вариант командной строки. Соответственно сначала все что попало в нее (непосредственно из строки или из .f файлов) парсится и только потом запускается компиляция с одним набором параметров.

 

По поводу всяких извращиней - что-то мне подсказывает что оно того не будет стоить. Имеется пара сотня файлов, и комплитиь нужно смешанно - часть из них с параметрами, а часть нет. А так как для компиляции vhdl важен порядок, то эти отдельные .f файлы может чуть и помогут, но в целом ситуация конечно грустная.
Наоборот - чем более "извращенее" придумаете тем проще будет в последствии.

Ну пара сотен файлов это немного - можно тупо забить в локальном setup.tcl например так и не парится.

proc com_module_abc {{mode ""}} {
  if {$mode!=""} { 
    puts "$mode:  Compile module_abc"
    return
  } 
  vcom -opt1 -opt2 arg2 \
    $::DSN/src/module1.vhd \
    $::DSN/src/module2.vhd 
}
proc com_module_def {{mode ""}} { .. }

proc com_all {{mode ""}} {
  com_module_abc  $mode 
  com_module_def  $mode
}

proc help {} {
  com_all "help"
}

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Это особенность TCL а не MdelSim. Параметром для proc (коими являются vcom/vlog ..) должен быть list аргументов - то есть когда вы пишете vcom -opt1 -opt2 agr2 file1 file2 то на вход vcom поступает vcom

Естественно если задать set arg "-2008 version.vhd" то это будет одна строка которая сама по себе в list не разобьется

тут надо извращаться например так:

vcom [lappend [list [split $arg " "]] version.vhd]

Так как раз передавать через list и не получается:

> vcom [list -2008 verions.vhd]
# ** Error (suppressible): (vcom-1902) Option "-2008 version.vhd" is either unknown, requires an argument, or was given with a bad argument.

В идеале удобнее всего работать через лист (один общий или несколько поменьше). И не надо этот же лист писать во временный файл и передавать его c опцией vcom -f f.tmp.

Пока мне в vcom удаётся скормить только "ручками прописанные" файлы с параметрами. Но чем мне не нравится такой подход:

vcom -opt1 -opt2 arg2 \
  $::DSN/src/module1.vhd \
  $::DSN/src/module2.vhd

нельзя закомментировать какую-то строку/файл (т.к. комментируется всё до конца бэкслешей).

Кстати vcom Active-HDL позволяет такие вольности. И нормально хавает список файлов с составными строками аргументов типа "-opt1 file1"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слушайте, Моделсим, конечно, убожество ещё то. У меня по этому поводу в совё время даже язвительная статья на другом ресурсе была. Но, с другой стороны, без него сейчас никуда. Ну можно ещё DSPbuilder задействовать, но он удобен для ваяния алгоритмических вещей, "тупой" HDL-код лучше мучать в Моделсиме (ну или его урезанной версии - Квестасиме).

 

А по поводу всех этих ваших проблем с синтаксисом я, например, не заморачиваюсь даже особо: генерю вхолостую какую-нибудь кору, поставив галочку "сгенерить тестбенчы для Моделсим", дальше эти тестбенчи вместе с командным батничком (тоже терпеть не могу копаться в убогом моделсимовском gui) копирую себе и подставляю свои файлы. Всегда так работало, никаких проблем. Ещё учтите, что у Моделсима часто случается несварение желудка от верилоговского кода. Он по-моему нормально поедает только vhdl.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Так как раз передавать через list и не получается:
Виноват - как говорится поспешиш людей насмешиш :(

Правильнее наверное будет vcom {*}

 

vcom -opt1 -opt2 arg2 \
  $::DSN/src/module1.vhd \
  $::DSN/src/module2.vhd

нельзя закомментировать какую-то строку/файл (т.к. комментируется всё до конца бэкслешей).

Тут уж уж выбирайте как проще - либо городить какую либо надстройку со структурой фалов и парсингом либо так побыстренькому. Мне это не мешает - не так уж и часто приходится коментить файлы в списке.

 

Кстати vcom Active-HDL позволяет такие вольности. И нормально хавает список файлов с составными строками аргументов типа "-opt1 file1"
Увы нет в мире идеала. Хотя в этом случае я пердпочитаю единобразие - тогда не болит голова при смене интрументов. А то например привык использовать опцию -F file.f а ее оказывется в старых ModelSim (у заказчика) нет :( Пришлось часть скриптов "упрощать"

 

Удачи! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Правильнее наверное будет vcom {*}
  1. То что надо! :yeah:

 

А по поводу всех этих ваших проблем с синтаксисом я, например, не заморачиваюсь даже особо: генерю вхолостую какую-нибудь кору, поставив галочку "сгенерить тестбенчы для Моделсим", дальше эти тестбенчи вместе с командным батничком (тоже терпеть не могу копаться в убогом моделсимовском gui) копирую себе и подставляю свои файлы. Всегда так работало, никаких проблем.
Работать-то работает. Но для большого количества файлов дейстивтельно быстрее получается компилировать не "поштучно" (на каждый файл свой vcom), а пачкой. Плюс всё равно мне нужно делать более сложный скрипт, чтобы учитывать разные конфигурации и прочие нюансы. Так что есть смысл заморочиться, да и полезно "для общего развития".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти