AnatolySh 0 2 сентября, 2014 Опубликовано 2 сентября, 2014 · Жалоба Прошу совета клуба. Мой вопрос касается упрощения вывода одинаковых внутренних сигналов одинаковых модулей, включённых в модуль верхнего уровня посредством директивы generate. Для формулировки вопроса максимально упростил свою задачу. Итого: у мне есть модуль верхнего уровня (for_ext), в котором я "инстанциирую" несколько одинаковых модулей нижнего уровня (for_int). Для моделирования используется test-bench for_ext_test и tcl do-файл work_for_loop.do Код файла for.v таков: `define CH_NUM 4 `define CH_NUM_RNG `CH_NUM - 1 : 0 `define PERIOD 10 `define HALF_PERIOD `PERIOD/2 `define START_RES 2 `define LENGTH_RES `PERIOD module for_int ( input clk, res, din, output reg dout); always @(posedge clk) dout <= (res) ? 1'b0: din; endmodule module for_ext ( input clk, res, input [`CH_NUM_RNG] din, output [`CH_NUM_RNG] dout ); genvar i; generate for (i = 0; i < `CH_NUM; i = i + 1) begin: gen_block for_int for_int_inst (.clk(clk), .res(res), .din(din[i]), .dout(dout[i])); end endgenerate endmodule `timescale 1ns / 100ps module for_ext_test; reg clk, res; reg [`CH_NUM_RNG] din; wire [`CH_NUM_RNG] dout; genvar i; for_ext for_ext_inst (.clk(clk), .res(res), .din(din), .dout(dout)); initial begin clk = 0; res = 0; #`START_RES res = 1; #`LENGTH_RES res = 0; end generate for (i = 0; i < `CH_NUM; i = i + 1) begin: din_init initial din[i] = 0; end endgenerate initial forever #(`HALF_PERIOD) clk = !clk; endmodule Код скрипта work_for_loop.do следующий: quit -sim vlog -incr -reportprogress 300 -work work_for_loop work_for_loop/for.v vsim -voptargs=+acc work_for_loop.for_ext_test -wlfdeleteonquit add wave -divider "for_ext_test" add wave sim:/for_ext_test/* for {set i 0} {$i < 3} {incr i} { add wave -divider {"for_ext_inst[$i]"} add wave {sim:/for_ext_test/for_ext_inst/gen_block[$i]/for_int_inst/*} } run 100ns view wave -title "monitor" -undock -x 1920 -y 0 -width 1280 -height 900 wave zoom full В результате запуска скрипта work_for_loop.do на выполнение Modelsim выдаёт: VSIM(paused)> do work_for_loop.do # Model Technology ModelSim ALTERA vlog 10.1d Compiler 2012.11 Nov 2 2012 # -- Compiling module for_int # -- Compiling module for_ext # -- Compiling module for_ext_test # # Top level modules: # for_ext_test # vsim -voptargs=+acc -wlfdeleteonquit work_for_loop.for_ext_test # Loading work_for_loop.for_ext_test # Loading work_for_loop.for_ext # Loading work_for_loop.for_int # ** Error: (vish-4014) No objects found matching '/for_ext_test/for_ext_inst/gen_block[$i]/for_int_inst/*'. # Error in macro ./work_for_loop.do line 11 # (vish-4014) No objects found matching '/for_ext_test/for_ext_inst/gen_block[$i]/for_int_inst/*'. # while executing # "add wave {sim:/for_ext_test/for_ext_inst/gen_block[$i]/for_int_inst/*}" # ("for" body line 3) # invoked from within # "for {set i 0} {$i < 3} {incr i} { # add wave -divider {"for_ext_inst[$i]"} # add wave {sim:/for_ext_test/for_ext_inst/gen_block[$i]/for_int_inst/*} # }" VSIM(paused)> Мой вопрос в следующем: как, используя средства tcl Modelsim-a вывести одинаковые сигналы одинаковых модулей в окно временных диаграмм? Возможно ли это? B) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 2 сентября, 2014 Опубликовано 2 сентября, 2014 · Жалоба add wave -divider "for_ext_test" add wave sim:/for_ext_test/* for {set i 0} {$i < 3} {incr i} { add wave -divider {"for_ext_inst[$i]"} add wave {sim:/for_ext_test/for_ext_inst/gen_block[$i]/for_int_inst/*} } Поскольку $i внутри фигурных скобок, подстановка $i не выполняется, отсюда и ошибка. Тут вместо фигурных скобок можно использовать бэкслэш для прикрытия квадратных скобок и кавычек: add wave -divider \"for_ext_inst\[$i\]\" add wave sim:/for_ext_test/for_ext_inst/gen_block\[$i\]/for_int_inst/* А вообще, кажется, нужно срочно написать небольшой гайд по синтаксису списков и подстановок tcl, там всё очень просто, если въехать, но вменяемой литературы по теме мне как-то не попадалось. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 2 сентября, 2014 Опубликовано 2 сентября, 2014 · Жалоба А вообще, кажется, нужно срочно написать небольшой гайд по синтаксису списков и подстановок tcl, там всё очень просто, если въехать, но вменяемой литературы по теме мне как-то не попадалось. http://tclstudy.narod.ru/tcl/lesson03.html http://tclstudy.narod.ru/tcl/lesson04.html http://tclstudy.narod.ru/tcl/lesson05.html Не? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 2 сентября, 2014 Опубликовано 2 сентября, 2014 · Жалоба http://tclstudy.narod.ru/tcl/lesson03.html http://tclstudy.narod.ru/tcl/lesson04.html http://tclstudy.narod.ru/tcl/lesson05.html Не? Нет, там не даётся чёткой системы и не рассмотрены некоторые тонкие моменты. Например, все смогут сходу без подсказки сказать, что выдаст следующая строчка? puts ; puts ; puts ; puts ; puts ] ; puts ] Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Поскольку $i внутри фигурных скобок, подстановка $i не выполняется, отсюда и ошибка. Спасибо. Всё работает. Даже и не помню (соответственно, не понимаю) откуда фигурные скобки взялись. + Вы правы: надо с Тиклем поподробнее ознакомиться, раз такие вопросы задаю. + Спасибо andrew_b за ссылки. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться