Знакомство с библиотекой UVM логично начать с примеров, которые включены в дистрибутив библиотеки. Запуск этих примеров в QuestaSim под Windows не может не вызвать затруднений, т.к. в предлагаемых Makefile'ах для запуска примеров есть ошибки. В этой статье я покажу, как с минимальной модификацией исходных Makefile'ов запустить примеры <UVM_HOME>/examples/simple/hello_world и <UVM_HOME>/examples/integrated/ubus. И в качестве бонуса более привычные для QuestaSim tcl-скрипты на замену Makefile'ам.

Описанные в статье процедуры выполнялись со следующим программным обеспечением:

  • QuestaSim 10.4a
  • UVM 1.2
  • GNU Make 3.82.90
  • gcc-4.5.0-mingw64

Если у Вас более ранняя версия QuestaSim, то рекомендую использовать UVM 1.1d.

Многие ошибочно полагают, что запуск Makefile'ов в QuestaSim под Windows вообще невозожен, т.к. первая попытка заканчивается сообщением:

#invalid command name "make"

Команда "make" не входит в состав QuestaSim, поэтому придется устанавливать ее отдельно. Процесс установки make мы опустим. Отмечу лишь, что для успешного продолжения при наборе команды:

QuestaSim> make -v

в командной строке QuestaSim или в командной строке Windows, вы должны увидеть что-то типа:

# GNU Make 3.82.90
# Built for i686-pc-mingw32
# Copyright (C) 1988-2012 Free Software Foundation, Inc.
# License GPLv3+: GNU GPL version 3 or later 
# This is free software: you are free to change and redistribute it.
# There is NO WARRANTY, to the extent permitted by law.


После установки make не забудьте добавить путь к make.exe в переменную среды PATH.

Запускаем UVM 1.2 "Hello World"

Открываем QuestaSim и перемещаемся в в папку <UVM_HOME>/examples/simple/hello_world.

QuestaSim> cd E:/libs/uvm-1.2/examples/simple/hello_world

Тут нас интересует Makefile.questa:

UVM_HOME	= ../../..

include ../../Makefile.questa

all: run

comp: vlib
	$(VLOG) +incdir+. \
		hello_world.sv

run: comp
	$(VSIM)
	$(CHECK)

В этом Makefile'е вызывается еще один Makefile.questa, который расположен на 2 уровня выше в папке <UVM_HOME>/examples.

По умолчанию в этих Makefile'ах происходит компиляция библиотеки DPI, после которой вы должны получить uvm_dpi.dll. Тут и начинаются настоящие проблемы. Чтобы самостоятельно скомпилировать эту uvm_dpi.dll придется немало полазить по предложенным Makefile'ам и форумам, где Вам расскажут, как исправить сделанные в этих Makefile'ах ошибки. НО даже после успешно скомпилированной uvm_dpi.dll, пример не запускается.

Разработчики из MentorGraphics включили в QuestaSim свою прекомпилированную версию библиотеки uvm_dpi.dll. Для того, чтобы использовать ее потребуется пара "костылей" в существующих Makefile'ах.

1. Создадим копию <UVM_HOME>/examples/simple/hello_world/Makefile.questa с новым названием, например, RunHelloWorld.questa:

QUESTA_HOME 				= "C:/questasim64_10.4a"
UVM_DPI_HOME 				= $(QUESTA_HOME)/uvm-1.2/win64
USES_PRECOMPILED_UVM_DPI 	= 1

UVM_HOME	= ../../..

include ../../CustomMakefile.questa

all: run

comp: vlib
	$(VLOG) +incdir+. \
		hello_world.sv

run: comp
	$(VSIM)
	$(CHECK)

Как видите, здесь добавлено 3 новых строки и изменено имя вложенного Makefile'а:

  1. 1) Путь к QuestaSim
  2. 2) Путь к прекомпилированной библиотеке uvm_dpi.dll.
  3. 3) И новая переменная USES_PRECOMPILED_UVM_DPI, которая будет использоваться в <UVM_HOME>/examples/CustomMakefile.questa

2. Теперь создадим копию <UVM_HOME>/examples/Makefile.questa с новым названием CustomMakefile.questa. Не буду приводить полный исходный код этого Makefile'а. Найдем следующий фрагмент кода:

ifeq ($(USES_DPI),1)
  DPILIB_VLOG_OPT = 
  DPILIB_VSIM_OPT = -sv_lib $(LIBDIR)/uvm_dpi 
  DPILIB_TARGET = dpi_lib$(BITS)
else
  DPILIB_VLOG_OPT = +define+UVM_NO_DPI 
  DPILIB_VSIM_OPT = 
  DPILIB_TARGET =
endif

Тут задается опция для симуляции DPILIB_VSIM_OPT, которая говорит, где искать библиотеку uvm_dpi, и цель DPILIB_TARGET для компиляции этой библиотеки. Мы не хотим самостоятельно компилировать эту библиотеку, поэтому изменим приведенный выше код:

ifeq ($(USES_PRECOMPILED_UVM_DPI),1)
  DPILIB_VLOG_OPT =
  DPILIB_VSIM_OPT = -sv_lib $(UVM_DPI_HOME)/uvm_dpi
  DPILIB_TARGET =
else ifeq ($(USES_DPI),1)
  DPILIB_VLOG_OPT =
  DPILIB_VSIM_OPT = -sv_lib $(LIBDIR)/uvm_dpi
  DPILIB_TARGET = dpi_lib$(BITS)
else
  DPILIB_VLOG_OPT = +define+UVM_NO_DPI 
  DPILIB_VSIM_OPT = 
  DPILIB_TARGET =
endif

Как видите, тут в конструкцию if-else добавлена еще одна ветка с переменными из RunHelloWorld.questa, которая задает новый путь к прекомпилированной uvm_dpi.

Вот, где должны быть расположены новые файлы:

  • bin
  • docs
  • examples
    • CustomMakefile.questa
    • integrated
      • apb
      • codec
      • README.txt
      • ubus
    • Makefile.ius
    • Makefile.questa
    • Makefile.vcs
    • questa_base.tcl
    • simple
      • basic_examples
      • callbacks
      • configuration
      • factory
      • hello_world
        • consumer.sv
        • hello_world.sv
        • Makefile.ius
        • Makefile.questa
        • Makefile.vcs
        • packet.sv
        • producer.sv
        • RunHelloWorld.questa
        • top.sv
      • interfaces
      • objections
      • README.txt
  • LICENSE.txt
  • NOTICE.txt
  • README.txt
  • release-notes.txt
  • src
  • UVM_Reference.html

Запускаемся из папки <UVM_HOME>/examples/simple/hello_world:

QuestaSim> make -f RunHelloWorld.questa all

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

...
# UVM_INFO @ 0 ns: reporter [RNTST] Running test ...
# UVM_INFO ../../../src/base/uvm_root.svh(579) @ 0 ns: reporter [UVMTOP] UVM testbench topology:
# ------------------------------------------------------------
# Name                    Type                   Size  Value  
# ------------------------------------------------------------
# top                     top                    -     -      
#   consumer              consumer #(T)          -     -      
#     in                  uvm_blocking_put_imp   -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     out                 uvm_get_port           -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     count               integral               32    'd0    
#     recording_detail    uvm_verbosity          32    UVM_LOW
#   fifo                  uvm_tlm_fifo #(T)      -     -      
#     get_ap              uvm_analysis_port      -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     get_peek_export     uvm_get_peek_imp       -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     put_ap              uvm_analysis_port      -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     put_export          uvm_put_imp            -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     recording_detail    uvm_verbosity          32    UVM_LOW
#   producer1             producer #(T)          -     -      
#     out                 uvm_blocking_put_port  -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     proto               packet                 -     -      
#     num_packets         integral               32    'd2    
#     count               integral               32    'd0    
#     recording_detail    uvm_verbosity          32    UVM_LOW
#   producer2             producer #(T)          -     -      
#     out                 uvm_blocking_put_port  -     -      
#       recording_detail  uvm_verbosity          32    UVM_LOW
#     proto               packet                 -     -      
#     num_packets         integral               32    'd4    
#     count               integral               32    'd0    
#     recording_detail    uvm_verbosity          32    UVM_LOW
#   recording_detail      uvm_verbosity          32    UVM_LOW
# ------------------------------------------------------------
# 
# UVM_INFO producer.sv(46) @ 0 ns: top.producer2 [producer] Starting.
# UVM_INFO producer.sv(62) @ 0 ns: top.producer2 [producer] Sending producer2-0
# UVM_INFO producer.sv(46) @ 0 ns: top.producer1 [producer] Starting.
# UVM_INFO producer.sv(62) @ 0 ns: top.producer1 [producer] Sending producer1-0
# UVM_INFO producer.sv(62) @ 10 ns: top.producer2 [producer] Sending producer2-1
# UVM_INFO producer.sv(62) @ 20 ns: top.producer2 [producer] Sending producer2-2
# UVM_INFO consumer.sv(57) @ 40 ns: top.consumer [consumer] Received producer1-0 local_count=1
# UVM_INFO producer.sv(62) @ 50 ns: top.producer1 [producer] Sending producer1-1
# UVM_INFO consumer.sv(57) @ 80 ns: top.consumer [consumer] Received producer2-0 local_count=2
# UVM_INFO producer.sv(62) @ 90 ns: top.producer2 [producer] Sending producer2-3
# UVM_INFO consumer.sv(57) @ 120 ns: top.consumer [consumer] Received producer1-1 local_count=3
# UVM_INFO producer.sv(73) @ 130 ns: top.producer1 [producer] Exiting.
# UVM_INFO consumer.sv(57) @ 160 ns: top.consumer [consumer] Received producer2-1 local_count=4
# UVM_INFO producer.sv(73) @ 170 ns: top.producer2 [producer] Exiting.
# UVM_INFO consumer.sv(57) @ 200 ns: top.consumer [consumer] Received producer2-2 local_count=5
# UVM_INFO consumer.sv(57) @ 240 ns: top.consumer [consumer] Received producer2-3 local_count=6
# UVM_INFO ../../../src/base/uvm_objection.svh(1271) @ 1000 ns: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
# UVM_INFO ../../../src/base/uvm_report_server.svh(847) @ 1000 ns: reporter [UVM/REPORT/SERVER] 
# --- UVM Report Summary ---
# 
# ** Report counts by severity
# UVM_INFO :   20
# UVM_WARNING :    0
# UVM_ERROR :    0
# UVM_FATAL :    0
# ** Report counts by id
# [RNTST]     1
# [TEST_DONE]     1
# [UVM/RELNOTES]     1
# [UVMTOP]     1
# [consumer]     6
# [producer]    10
# 
# ** Note: $finish    : ../../../src/base/uvm_root.svh(517)
#    Time: 1 us  Iteration: 68  Instance: /hello_world
# End time: 08:36:23 on Aug 02,2016, Elapsed time: 0:00:07
# Errors: 0, Warnings: 0
# RunHelloWorld.questa:37: recipe for target 'run' failed
# process_begin: CreateProcess(NULL, . ( `grep -c "UVM_ERROR :    0" questa.log` -eq 1 ) -a ( `grep -c "UVM_FATAL :    0" questa.log` -eq 1 ), ...) failed.
# make (e=5): Îòêàçàíî â äîñòóïå.
# 
# make.EXE: *** [run] Error 5

Несмотря на странные сообщения в конце, пример выполнился. А эти строки:

# RunHelloWorld.questa:37: recipe for target 'run' failed
# process_begin: CreateProcess(NULL, . ( `grep -c "UVM_ERROR :    0" questa.log` -eq 1 ) -a ( `grep -c "UVM_FATAL :    0" questa.log` -eq 1 ), ...) failed.
# make (e=5): Îòêàçàíî â äîñòóïå.
# 
# make.EXE: *** [run] Error 5

результат неправильного парсинга лог-файла на наличие ошибок. Дело в том, что этот парсер использует линуксовую команду grep. Я сделал пару попыток адаптировать этот парсер под Windows, но...не сложилось. Пока просто уберем этот парсинг из <UVM_HOME>/examples/simple/RunHelloWorld.questa:

...
run: comp
	$(VSIM)
#	$(CHECK)

Запускаем UVM 1.2 "UBUS"

Для запуска примера <UVM_HOME>/examples/integrated/ubus/examples будет использоваться описанный выше <UVM_HOME>/examples/CustomMakefile.questa.

Создадим копию <UVM_HOME>/examples/integrated/ubus/examples/Makefile.questa с новым названием RunUbus.questa:

QUESTA_HOME 				= "C:/questasim64_10.4a"
UVM_DPI_HOME 				= $(QUESTA_HOME)/uvm-1.2/win64
USES_PRECOMPILED_UVM_DPI 	= 1

UVM_HOME	= ../../../..
USES_DPI = 1
UVM_TESTNAME ?=test_2m_4s

include ../../../CustomMakefile.questa

all: run

comp: vlib
	$(VLOG) +incdir+../sv \
		ubus_tb_top.sv

run: comp
	$(VSIM) +UVM_TESTNAME=$(UVM_TESTNAME)
#	$(CHECK)

Новые файлы:

  • bin
  • docs
  • examples
    • CustomMakefile.questa
    • integrated
      • apb
      • codec
      • README.txt
      • ubus
        • examples
          • dut_dummy.v
          • Makefile.ius
          • Makefile.questa
          • Makefile.vcs
          • questa.tops
          • RunUbus.questa
          • run_ubus.tcl
          • test_lib.sv
          • ubus_example_master_seq_lib.sv
          • ubus_example_scoreboard.sv
          • ubus_example_tb.sv
          • ubus_tb_top.sv
          • vsim.do
        • sv
          • ubus_bus_monitor.sv
          • ubus_env.sv
          • ubus_if.sv
          • ubus_master_agent.sv
          • ubus_master_driver.sv
          • ubus_master_monitor.sv
          • ubus_master_sequencer.sv
          • ubus_master_seq_lib.sv
          • ubus_pkg.sv
          • ubus_slave_agent.sv
          • ubus_slave_driver.sv
          • ubus_slave_monitor.sv
          • ubus_slave_sequencer.sv
          • ubus_slave_seq_lib.sv
          • ubus_transfer.sv
          • ubus_version.svh
    • Makefile.ius
    • Makefile.questa
    • Makefile.vcs
    • questa_base.tcl
    • simple
      • basic_examples
      • callbacks
      • configuration
      • factory
      • hello_world
      • interfaces
      • objections
      • README.txt
  • LICENSE.txt
  • NOTICE.txt
  • README.txt
  • release-notes.txt
  • src
  • UVM_Reference.html

Запускаем:

QuestaSim> cd E:/libs/uvm-1.2/examples/integrated/ubus/examples
QuestaSim> make -f RunUbus.questa all

Tcl-скрипты для запуска UVM 1.2 "UBUS"

Старался по максимуму перенести все содержимое Makefile'ов. Для описания целей используются tcl-процедуры proc.

Общий для примеров скрипт questa_base.tcl:

set USES_DPI 1
if [info exists UVM_NO_DPI] {
	set USES_DPI 0
}

#---------------------------------------------------------------
# Define Variables
#---------------------------------------------------------------
if ![info exists UVM_HOME] {
	set UVM_HOME ".."
}

if ![info exists UVM_DPI_HOME] {
	set UVM_DPI_HOME ".."
}
						
if ![info exists MTI_HOME] {
	set MTI_HOME ${QUESTA_HOME}
}

set LIBDIR  	${UVM_HOME}/lib
#set GCC     	${MTI_HOME}/gcc-4.1.2-linux/bin/g++
set GCC     	gcc
set TEST    	/usr/bin/test

if ![info exists BITS] {
	set BITS 32
}

set LIBNAME 	uvm_dpi
set DPI_SRC 	${UVM_HOME}/src/dpi/uvm_dpi.cc

set GCCCMD  "exec ${GCC} \
        -m${BITS} \
        -fPIC \
        -DQUESTA \
        -g \
        -W \
        -shared \
        -x c \
        -I${MTI_HOME}/include \
        ${DPI_SRC} \
        -o ${LIBDIR}/${LIBNAME}.so"
	
set WIN_GCC 	${MTI_HOME}/gcc-4.5.0-mingw64/bin/g++.exe
		
set GCC_WINCMD \
        "exec ${WIN_GCC} \
        -g \
        -DQUESTA \
        -W \
        -shared \
        -Bsymbolic \
        -I${MTI_HOME}/include \
		-I${UVM_HOME}/src \
        -I${UVM_HOME}/src/dpi/uvm_dpi.cc \
        -o ${UVM_HOME}/lib/uvm_dpi.dll \
		${MTI_HOME}/win64/mtipli.dll \
		-I${MTI_HOME}/gcc-4.5.0-mingw64/include -lregex"

set VLIB 	"exec vlib work"

#---------------------------------------------------------------
# If USES_DPI is set, enables compilation and loading of DPI
# libraries. Enabling DPI adds +acc on command line, which
# may adversely affect simulator performance.
#---------------------------------------------------------------
if {${USES_PRECOMPILED_UVM_DPI} == 1} {
	set DPILIB_VLOG_OPT 	""
	set DPILIB_VSIM_OPT 	"-sv_lib ${UVM_DPI_HOME}/uvm_dpi"
	set DPILIB_TARGET 		""
} elseif {${USES_DPI} == 1} {
	set DPILIB_VLOG_OPT 	""
	set DPILIB_VSIM_OPT 	"-sv_lib ${LIBDIR}/uvm_dpi"
	set DPILIB_TARGET 		dpi_lib${BITS}
} else {
	set DPILIB_VLOG_OPT 	"+define+UVM_NO_DPI"
	set DPILIB_VSIM_OPT 	""
	set DPILIB_TARGET 		""
}

if ![info exists VLOG_OPT] {
	set VLOG_OPT ""
}
if ![info exists VSIM_OPT] {
	set VSIM_OPT ""
}
if ![info exists OPT_C] {
	set OPT_C ""
}
if ![info exists OPT_R] {
	set OPT_R ""
}

set VLOG  "exec vlog \
        -timescale \"1ns/1ns\" \
        ${DPILIB_VLOG_OPT} \
        ${VLOG_OPT} \
        ${OPT_C} \
        -mfcu \
        -suppress 2181 \
        +acc=rmb \
        -writetoplevels questa.tops \
        +incdir+${UVM_HOME}/src \
        ${UVM_HOME}/src/uvm.sv"		

set VSIM "exec vsim \
        ${DPILIB_VSIM_OPT} \
        ${VSIM_OPT} \
        ${OPT_R} \
        -c \
        -do \"run -all; q\" \
        -l questa.log \
        -f questa.tops"			
		
set N_ERRS 		0
set N_FATALS 	0

#CHECK = \
#	@$(TEST) \( `grep -c 'UVM_ERROR :    $(N_ERRS)' questa.log` -eq 1 \) -a \
#		 \( `grep -c 'UVM_FATAL :    $(N_FATALS)' questa.log` -eq 1 \)

#---------------------------------------------------------------
# Define Targets
#
# vlog and vsim targets defined in individual examples
#---------------------------------------------------------------


proc help {} { 
	puts "Usage:  do questa_base.tcl"
	puts ""
	puts "Typical:"
	puts "  do questa_base.tcl"
	puts ""
	puts "where target is any of"
	puts ""
	puts "  dpi_lib     - compile DPI lib (use BITS=XX, def=32)"
	puts "  dpi_lib32   - compile DPI lib for 32-bit Linux (BITS=32)"
	puts "  dpi_lib64   - compile DPI lib for 64-bit Linux (BITS=64)"
	puts "  dpi_libWin  - compile DPI lib for Windows"
	puts ""
	puts "  clean       - removes all derived files"
	puts "  vlib 		- creates work library"
	puts "  prepare     - invokes clean, vlib, and dpi_lib targets"
	puts ""
	puts "When this tcl-script is included by a tcl-script from an example"
	puts "sub-directory, additional targets should be available:"
	puts ""
	puts "  all       - invokes targets prepare, vlog, and vsim"
	puts "  vlog      - invokes the vlog compiler"
	puts "  vsim      - invokes the vsim simulator"
	puts ""
	puts "Variables: specify any of the following on the make command line"
	puts ""
	puts "  UVM_HOME  - root directory of the UVM library (default:..)"
	puts "  UVM_VERBOSITY - verbosity level for vsim (default:UVM_MEDIUM)"
	puts "  BITS      - the bus architecture: 32 or 64 (default:32)"
	puts "  LIBNAME   - the root name of the dpi library (default:uvm_dpi)"
	puts "  LIBDIR    - the location to put the dpi lib (default:UVM_HOME/lib)"
	puts ""
}

proc vlib_target {} {
	global DPILIB_TARGET
	global GCCCMD
	
	if { [string length $DPILIB_TARGET] > 0 } {
		[$DPILIB_TARGET]
	}
	
	eval exec vlib work
}	
	
proc prepare {} {
	global DPILIB_TARGET
	clean
	vlib_target
	if { [string length $DPILIB_TARGET] > 0 } {
		[$DPILIB_TARGET]
	}
}
	
proc dpi_lib {} {
	global LIBDIR
	global GCCCMD
	
	file mkdir ${LIBDIR}
	eval ${GCCCMD}
}
	
proc dpi_libWin {} {
	global LIBDIR
	global GCC_WINCMD
	
	file mkdir ${LIBDIR}
	eval ${GCC_WINCMD}
}

proc dpi_lib32 {} {
	set BITS 32
	dpi_lib
}
	
proc dpi_lib64 {} {
	set BITS 64
	dpi_lib
}
	
proc clean {} {
	file delete -force -- *~ work vsim.wlf* *.log questa.tops transcript *.vstf
}	

Tcl-скрипт для примера UBUS run_ubus.tcl:

#!/usr/bin/tclsh
set QUESTA_HOME 						"C:/questasim64_10.4a"
set UVM_DPI_HOME 						${QUESTA_HOME}/uvm-1.2/win64						
set USES_PRECOMPILED_UVM_DPI 			1

set UVM_HOME	"../../../.."				
set USES_DPI 							1
set UVM_TESTNAME 						test_2m_4s

source ../../../questa_base.tcl

proc comp {} {
	global VLOG
	
	vlib_target
	eval ${VLOG}  +incdir+../sv \
		ubus_tb_top.sv		
}

proc run {} {
	global VSIM
	global UVM_TESTNAME
	
	comp
	eval ${VSIM}  +UVM_TESTNAME=${UVM_TESTNAME}
}

proc all {} {
	run
}

proc alt {} {
	global UVM_HOME
	
	set QVERILOG "exec qverilog \
        -timescale \"1ns/1ns\" \
        +acc=rmb \
        +incdir+${UVM_HOME}/src+../sv \
        ${UVM_HOME}/src/uvm.sv \
        ubus_tb_top.sv \
		${UVM_HOME}/src/dpi/uvm_dpi.cc  \
        -R \
        +UVM_TESTNAME=test_2m_4s \
        -c \
        -do \"run -all; q\" \
        -l questa.log"
	
	eval ${QVERILOG}
}

if { [string length $1] > 0 } {
	[$1]
}

Расположение новых файлов:

  • bin
  • docs
  • examples
    • CustomMakefile.questa
    • integrated
      • apb
      • codec
      • README.txt
      • ubus
        • examples
          • CustomMakefile.questa
          • dut_dummy.v
          • Makefile.ius
          • Makefile.questa
          • Makefile.vcs
          • questa.tops
          • RunUbus.questa
          • run_ubus.tcl
          • test_lib.sv
          • ubus_example_master_seq_lib.sv
          • ubus_example_scoreboard.sv
          • ubus_example_tb.sv
          • ubus_tb_top.sv
          • vsim.do
        • sv
          • ubus_bus_monitor.sv
          • ubus_env.sv
          • ubus_if.sv
          • ubus_master_agent.sv
          • ubus_master_driver.sv
          • ubus_master_monitor.sv
          • ubus_master_sequencer.sv
          • ubus_master_seq_lib.sv
          • ubus_pkg.sv
          • ubus_slave_agent.sv
          • ubus_slave_driver.sv
          • ubus_slave_monitor.sv
          • ubus_slave_sequencer.sv
          • ubus_slave_seq_lib.sv
          • ubus_transfer.sv
          • ubus_version.svh
    • Makefile.ius
    • Makefile.questa
    • Makefile.vcs
    • questa_base.tcl
    • simple
      • basic_examples
      • callbacks
      • configuration
      • factory
      • hello_world
      • interfaces
      • objections
      • README.txt
  • LICENSE.txt
  • NOTICE.txt
  • README.txt
  • release-notes.txt
  • src
  • UVM_Reference.html

Запуск:

QuestaSim> cd E:/libs/uvm-1.2/examples/integrated/ubus/examples
QuestaSim> do run_ubus.tcl all

Всю жизнь запускал tcl-скрипты командой source, но при подготовке материала выяснилось, что QuestaSim в этом случае не воспринимает передаваемые в строке параметры (в приведенной выше команде это название цели all).