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

Циклический вывод wave-форма в do файле Modelsim

Прошу совета клуба.

 

Мой вопрос касается упрощения вывода одинаковых внутренних сигналов одинаковых модулей, включённых в модуль верхнего уровня посредством директивы 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)

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


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

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, там всё очень просто, если въехать, но вменяемой литературы по теме мне как-то не попадалось.

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


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

А вообще, кажется, нужно срочно написать небольшой гайд по синтаксису списков и подстановок tcl, там всё очень просто, если въехать, но вменяемой литературы по теме мне как-то не попадалось.

http://tclstudy.narod.ru/tcl/lesson03.html

http://tclstudy.narod.ru/tcl/lesson04.html

http://tclstudy.narod.ru/tcl/lesson05.html

 

Не?

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


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

Нет, там не даётся чёткой системы и не рассмотрены некоторые тонкие моменты. Например, все смогут сходу без подсказки сказать, что выдаст следующая строчка?

puts

  1. ; puts
    1. ; puts
      1. ; puts
        1. ; puts
          1. ] ; puts
            1. ]

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


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

Поскольку $i внутри фигурных скобок, подстановка $i не выполняется, отсюда и ошибка.

Спасибо. Всё работает.

Даже и не помню (соответственно, не понимаю) откуда фигурные скобки взялись.

+ Вы правы: надо с Тиклем поподробнее ознакомиться, раз такие вопросы задаю.

+ Спасибо andrew_b за ссылки.

 

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...