Languages

CommunityCategory: XMODEL‘xmodel’ 명령을 사용하지 않고 XMODEL primitive들을 포함한 SystemVerilog 시뮬레이션을 수행하는 법

XMODEL

‘xmodel’ 명령을 사용하지 않고 XMODEL primitive들을 포함한 SystemVerilog 시뮬레이션을 수행하는 법

SA Support Team Staff 2020-07-29

XMODEL의 primitive를 사용한 다수의 SystemVerilog 모델을 생성하였고, 이제 그 모델들을 더 상위 레벨의 시스템 시뮬레이션에 포함시키고 싶습니다. 다만, 이 시스템 시뮬레이션은 현재 'ncverilog' 또는 'vcs' 명령을 실행하도록 셋업되어 있어요. XMODEL 모델들을 사용하려면 이 명령을 'xmodel'로 바꾸어야 하나요? 다시 말해, XMODEL primitive들이 포함된 SystemVerilog 시뮬레이션을 'ncverilog''vcs' 명령을 직접 사용해 실행할 수 있는 방법이 있나요?

2 Answers
SA Support Team Staff 2020-07-29

예, 'xmodel' 명령을 사용하지 않고도 XMODEL primitive를 포함한 SystemVerilog 시뮬레이션을 수행하실 수 있습니다. 사실, 이 'xmodel' 런처는 VCS, NCVerilog/Xcelium, ModelSim/Questa 등 시뮬레이터의 종류에 관계없이 일관성 있는 커맨드라인 인터페이스를 제공하기 위한 wrapper 스크립트입니다. 사용자가 'xmodel' 명령을 사용해 시뮬레이션을 실행하면, 그 명령은 선택된 SystemVerilog 시뮬레이터 명령으로 변환되어 실행됩니다.

'xmodel' 명령에 '--command' 옵션을 추가하면, 이 변환되어 실행되는 SystemVerilog 시뮬레이터 명령들이 무엇들인지 볼 수 있습니다. 아래와 같은 xmodel 명령을 예로 들어보겠습니다. 아래 명령은 VCS를 시뮬레이터로 사용한 경우입니다.

xmodel tb.sv --top tb --simtime 10ns --timescale 1ps/1ps --sim vcs

여기에 '--command' 옵션을 추가하면, 다음과 같이 실제로 실행되는 VCS 관련 명령 및 옵션을 보실 수 있습니다.

$ xmodel tb.sv --top tb --simtime 10ns --timescale 1ps/1ps --sim vcs --command

vcs +v2k -sverilog +vpi -debug_access +incdir+${XMODEL_HOME}/include \
    -f ${XMODEL_HOME}/include/xmodel.f -top XMODEL_global -full64 \
    -P ${XMODEL_HOME}/lib/x86_64/xmodel_vcs.tab ${XMODEL_HOME}/lib/x86_64/xmodel_vcs.so \
    tb.sv -top tb -timescale=1ps/1ps +define+XMODEL +define+XMODEL_TIMEPRECISION=1ps \
    -o ./simv
./simv +vcs+finish+10ns

또 다른 예로, NCVerilog를 시뮬레이터로 사용하는 경우에는 아래와 같은 명령을 보실 수 있습니다.

$ xmodel tb.sv --top tb --simtime 10ns --timescale 1ps/1ps --sim ncverilog --command

ncverilog -elaborate +nctop+XMODEL_global +ncerror+CUVMPW \
    +incdir+${XMODEL_HOME}/include -f ${XMODEL_HOME}/include/xmodel.f \
    +nc64bit +sv_lib=${XMODEL_HOME}/lib/x86_64/xmodel_nc.so \
    +loadvpi=${XMODEL_HOME}/lib/x86_64/xmodel_nc:sys_register_xmodel +access+rwc \
    tb.sv +nctop+tb +nctimescale+1ps/1ps +define+XMODEL +define+NCVERILOG \
    +define+XMODEL_TIMEPRECISION=1ps
ncverilog -R -s +ncunbuffered +nc64bit +sv_lib=${XMODEL_HOME}/lib/x86_64/xmodel_nc.so \
    +loadvpi=${XMODEL_HOME}/lib/x86_64/xmodel_nc:sys_register_xmodel \
    -input "@run -timepoint 10ns; exit"

아래는 XCelium의 경우입니다.

$ xmodel tb.sv --top tb --simtime 10ns --timescale 1ps/1ps --sim xcelium --command

xmverilog -elaborate +xmtop+XMODEL_global +xmerror+CUVMPW \
    +incdir+${XMODEL_HOME}/include -f ${XMODEL_HOME}/include/xmodel.f \
    +xm64bit +sv_lib=${XMODEL_HOME}/lib/x86_64/xmodel_xm.so \
    +loadvpi=${XMODEL_HOME}/lib/x86_64/xmodel_xm:sys_register_xmodel +access+rwc \
    tb.sv +xmtop+tb +xmtimescale+1ps/1ps +define+XMODEL +define+NCVERILOG 
    +define+XMODEL_TIMEPRECISION=1ps
xmverilog -R -s +xmunbuffered +xm64bit +sv_lib=${XMODEL_HOME}/lib/x86_64/xmodel_xm.so \
    +loadvpi=${XMODEL_HOME}/lib/x86_64/xmodel_xm:sys_register_xmodel \
    -input "@run -timepoint 10ns; exit"

그리고 ModelSim/Questa의 경우에는 아래와 같습니다.

$ xmodel tb.sv --top tb --simtime 10ns --timescale 1ps/1ps --sim modelsim --command

vlib work
vlog -sv -mfcu +incdir+${XMODEL_HOME}/include -f ${XMODEL_HOME}/include/xmodel.f \
    tb.sv -timescale 1ps/1ps +define+XMODEL +define+XMODEL_TIMEPRECISION=1ps
vsim -c XMODEL_global -sv_lib ${XMODEL_HOME}/lib/x86_64/xmodel_msim \
    -pli ${XMODEL_HOME}/lib/x86_64/xmodel_msim.sl tb -do "run 10ns; exit" \
    -wlf ./xmodel.wlf

최적의 결과를 위해 'xmodel' 런처가 사용하는 실제 SystemVerilog 시뮬레이터 명령 및 옵션들은 추후 release에서 공지없이 바뀔 수도 있음을 유의해주시기 바랍니다.

SA Support Team Staff 2021-01-25

추가로, 아래는 같은 시뮬레이션을 'xmverilog' 명령 대신 'xrun' 또는 'xmsim' 명령을 사용해 수행하는 예시입니다. 이들 명령은 모두 Cadence Xcelium의 명령이고, 최종적으로는 모두 같은 결과를 내지만, 이들이 사용하는 옵션의 형식에는 미세한 차이가 있음에 유의바랍니다(예를 들면, +loadvpi 대신 -loadvpi).

xrun -top XMODEL_global -xmerror CUVMPW \
    -incdir ${XMODEL_HOME}/include -f ${XMODEL_HOME}/include/xmodel.f \
    -64bit -sv_lib ${XMODEL_HOME}/lib/x86_64/xmodel_xm.so \
    -loadvpi ${XMODEL_HOME}/lib/x86_64/xmodel_xm:sys_register_xmodel -access +rwc \
    -define XMODEL -define NCVERILOG -define XMODEL_TIMEPRECISION=1ps \
    tb.sv -top tb -timescale 1ps/1ps \
    -unbuffered -input "@run -timepoint 10ns; exit"
xmvlog -sv -incdir ${XMODEL_HOME}/include -f ${XMODEL_HOME}/include/xmodel.f \
    -define XMODEL -define NCVERILOG -define XMODEL_TIMEPRECISION=1ps \
    tb.sv
xmelab XMODEL_global -timescale 1ps/1ps -xmerror CUVMPW \
    -loadvpi ${XMODEL_HOME}/lib/x86_64/xmodel_xm:sys_register_xmodel -access +rwc \
    tb -snapshot worklib.tb:module
xmsim worklib.tb:module \
    -64bit -sv_lib ${XMODEL_HOME}/lib/x86_64/xmodel_xm.so \
    -loadvpi ${XMODEL_HOME}/lib/x86_64/xmodel_xm:sys_register_xmodel \
    -unbuffered -input "@run -timepoint 10ns; exit"

비슷한 경우로, 아래는 'ncverilog' 명령 대신 'irun' 또는 'ncsim' 명령을 사용해 수행하는 예시입니다. 역시 이들 명령은 모두 Cadence INCISIVE(NCVerilog) 패키지의 명령이지만, 이들이 사용하는 옵션의 형식에는 미세한 차이가 있습니다.

irun -top XMODEL_global -ncerror CUVMPW \
    -incdir ${XMODEL_HOME}/include -f ${XMODEL_HOME}/include/xmodel.f \
    -64bit -sv_lib ${XMODEL_HOME}/lib/x86_64/xmodel_nc.so \
    -loadvpi ${XMODEL_HOME}/lib/x86_64/xmodel_xm:sys_register_xmodel -access +rwc \
    -define XMODEL -define NCVERILOG -define XMODEL_TIMEPRECISION=1ps \
    tb.sv -top tb -timescale 1ps/1ps \
    -unbuffered -input "@run -timepoint 10ns; exit"
ncvlog -sv -incdir ${XMODEL_HOME}/include -f ${XMODEL_HOME}/include/xmodel.f \ 
    -define XMODEL -define NCVERILOG -define XMODEL_TIMEPRECISION=1ps \
    tb.sv
ncelab XMODEL_global -timescale 1ps/1ps -ncerror CUVMPW \
    -loadvpi ${XMODEL_HOME}/lib/x86_64/xmodel_nc:sys_register_xmodel -access +rwc \
    tb -snapshot worklib.tb:module
ncsim worklib.tb:module \
    -64bit -sv_lib ${XMODEL_HOME}/lib/x86_64/xmodel_nc.so \
    -loadvpi ${XMODEL_HOME}/lib/x86_64/xmodel_nc:sys_register_xmodel \
    -unbuffered -input "@run -timepoint 10ns; exit"