Foundation Simulation Script의 이해...

 

|====================================================================
|================== Foundation Script Template File =================
| 이것은 Xilinx Foundation Simulation 언어에 대한 예제 파일 입니다.
| 이 명령어들은 Viewlogic 회사의 Vsim command 와 호환이 됩니다. 기
| 존에 Vsim 을 사용하신 사용자는 기존 vsim command script file를 이
| 용하실 수 있습니다. 이 예제는 사용자가 command scripts를 어떻게
| 만들어 사용할 것인가에 대한 기본적인 명령어 사용 방법들을 제공
| 하고 있습니다. Aldec simulator는 GUI(graphical User Interface)로
| 도 사용되며 Scripts는디자인 사이즈가 크고 복잡한 것을 simulation
| 하는데 유용합니다.
|
| "|" 문자는 주석문을 만들때 사용되며 문장 시작 맨 앞에 위치합니다.
|
| Written by J.W. Brooks Xilinx FAE, Nashua, NH
| Insight Korea FAE, Ha, Tae-Wook 번역,추가
| email address : twha@hmelec.co.kr
|====================================================================
|================== SETUP the Stimulus environment ==================
|
|simulator window에 있는 모든 신호들 지우기
|
delete_signals   | 또는 dels
|--------------------------
| print 명령에 의해 simulation result를 가지고 있는 sim_out.out file
| 를 삭제하는 명령이 "cplr" 이다.
|
clpr sim_out.out
|--------------------------
| 시뮬레이션 시작점을 0 으로 재시작하기
|
restart
|--------------------------
| simulator mode을 functional simulation 으로 설정하기
| 여러분은 아마도 simulator를 시작시킬 때 선택된 mode를 가지고 있
| 을 것이다. 하지만 이 script를 사용하여 재설정 할 수도 있다.
|
|set_mode functional   | * functional simulation *
|set_mode timing       | * timing simulation *
|--------------------------
| Vectors 설정하기
|
| 'vector' 또는 'v' 명령은 버스,또는 개별신호들을 그룹형태로 만들
| 어 준다. 입력과 출력신호들을 묶어서 같은 vector 로 만들 수는 없
| 다. 이 기능을 사용하여 이용자는 관심 있는 신호들만을 버스 형태
| 로 묶어서 그 결과를 확인해 보는 데 유용하게 사용이 된다.
| 유의해야 할 점은 신호자체가 BUS 형태, 예를 들면 ADD[7:0] DATA[7:0]
| 들도 vector 신호로 만들어야 simulator window에서 볼 수 있다.
|
| Controls:
vector CONTROL_VEC CLOCK I_CLK_EN I_LOAD I_ADDSUM
|
| 위의 예는 CLOCK, I_CLK_EN, I_LOAD, I_ADDSUM 4개의 신호를 CONTROL_VEC
| 이라는 그룹신호로 만들어 주는 것을 의미한다.
|
| Inputs:
vector INDAT_VEC I_DAT_IN[7:0]
|
| 위의 예는 I_DAT_IN[7:0] 라는 8 bit 신호를 INDAT_VEC 이라는 vector
| 신호로 만들어 주는 것을 의미한다.
|
| Outputs:
vector ACCOUT_VEC O_ACC_OUT[7:0]
|
| 위의 예는 O_ACC_OUT[7:0] 라는 8 bit 신호를 ACCOUNT_VEC 이라는 vector
| 신호로 만들어 주는 것을 의미한다.
|
|--------------------------
| watch 명령어는 waveform window 에 보여질 신호들을 정의할 때 사용된다.
| 부가적으로 만일 그 신호들이 파일에 출력되기를 원하면 반드시 watch
| 문장에 그 신호들을 적어 넣어야 한다.
| 아래의 명령은 O_C_OUT SimGlobalReset IN OUT 4개의 신호가 waveform window에
| 보여지는 것을 말하고 있다.
|
watch O_C_OUT SimGlobalReset IN OUT
|--------------------------
| waveform window(viewer)에 보여질 vector signal의 값을 16진수로 표시하는 방법.
|
radix hex INDAT_VEC
radix hex ACCOUT_VEC
|
|--------------------------
| clock의 step 크기를 설정하는 법
|아래의 예는 clock의 한 펄스폭이 50ns 로 설정한다.
|
stepsize 50.0ns
|
|--------------------------
| "clock" 명령어를 이용하여 clock singal을 정의한다.
| 아래의 예는 CLOCK 이라는 singal을 한 주기가 100ns (50ns - LOW, 50ns-HIGH)
| 인 clock으로 설정한다. 반복적인 신호는 이 명령어를 사용하여 만든다.
|
clock CLOCK 0 1
| clock CLK1 0 0 1 1 * LOW PULSE WIDTH가 2 steps, HIGH PULSE WIDTH가 2 steps
| clock CLK2 0 1 1   * LOW PULSE WIDTH가 1 step, HIGH PULSE WIDTH가 2 steps
|
|--------------------------
| "pattern" 명령어를 이용하여 clock singal 또는 일정한 pattern을 가지는
| 신호를 정의한다.
| 아래의 예는 din[7:0] bus singal을 20ns 주기로 값이 '1'씩 증가하는 패턴을
| 정의한다.
|
| vector in_d din[7:0]
| pattern in_d 0 1 10 11 100 101 110 111
| stepsize 20ns
| watch in_d
| run
|
|--------------------------
| 'assign' 을 사용하여 초기값을 signal에 할당한다.
| 만일 새로운 값을 원할 때는 assign 명령을 사용하여 다시 신호값을 준다.
|
assign I_LOAD 0         | I_LOAD signal에 0(LOW) 값을 할당
assign I_ADDSUM 1       | I_ADDSUM_1 singal에 1(HIGH) 값을 할당
assign I_CLK_EN 0       | I_CLK_EN singal에 0(LOW) 값을 할당
assign GSR 0            | GSR singal에 0(LOW) 값을 할당
assign I_CE 0           | I_CE singal 0(LOW) 값을 할당
assign I_OE 1           | I_OE singal 1(HIGH) 값을 할당
assign B_IO 1           | B_IO singal 1(HIGH) 값을 할당
|
| 입력 버스에 값을 주는 방법은 여러가지가 있다.
|
| 방법 1: assign statement을 사용하여 직접 신호값을 할당하고 신호값이
|    변화할 때 다시 assign statement 을 사용하여 신호값을 주는 방법
|
|                       assign INDAT_VEC 01\H
|
| 방법 2: wfm command을 사용하여 시간대별로 stimulus values을 주는 방법
|    assign 으로 마지막 시간대 이후에 정의한 신호값이 없으면 simulator
|    는 마지막 신호값을 유지한다.
|
|    -- 절대시간(Absolute Time)은 "@" 문자로 시작한다.
|    -- "@" 문자없이 시작되는 시간은 상대시간(Relative Time)을 의미한다.
|    -- "+" 현재의 LINE과 다음의 LINE을 연결할 때 사용한다.
|
wfm INDAT_VEC @0ns=01\H +
              @300ns=02\H +
              @600ns=05\H +
              @900ns=10\H
|
| 위의 문장은 INDAT_VEC vector signal에 절대시간으로 hexadecimal값을 할당
| 하고 있다. 0ns 에 01값을 300ns 에 02값을 600ns 에 05값을 900ns에 10값을
| 할당하고 있다.
|
| 방법 3: stim.dat(파일이름은 사용자가 마음대로 할당할 수 있다) 파일에
|    할당될 신호값을 저장한 후 wfm command을 사용하여 Re direct 시키는 방법
|
|-------start stim.dat (not including this line)--------
| @0ns=01\H +
| @300ns=02\H +
| @600ns=05\H +
| @900ns=10\H
|-------end stim.dat (not including this line)--------
|
| wfm INDAT_VEC < stim.dat
|
|%%%%%%%%%%%%%%%%% wfm의 여러가지 사용법 %%%%%%%%%%%%%%%%%
|
| 1. 신호의 값을 일정하게 감소
|
|   wfm 신호명 시작시간=신호값(시간 주기=dec by 감소원하는 값)*반복횟수
|
|   시간주기에 시간에 단위가 없으면 기본적으로 100 pico second이다.
|   그러므로 1000 는 100ns 가 된다.
|
|   wfm signal1 0=FF\H (1000=dec by 1)*4
|
|   신호 signal1은 0ns 일때 'FF\H' 이고 100ns마다 '1'씩 감소한다.
|   100ns뒤에는 'FE\H'가 되고 200ns뒤에는 'FD\H'가 된다.
|
| 2. 신호의 값을 일정하게 증가
|
|   wfm 신호명 시작시간=신호값(시간 주기=inc by 증가원하는 값)*반복횟수
|
|   wfm signal1 0=00\H (1000=dec by 1)*4
|
|   신호 signal1은 0ns 일때 '00\H' 이고 100ns마다 '1'씩 증가한다.
|   100ns뒤에는 '01\H'가 되고 200ns뒤에는 '02\H'가 된다.
|
| 3. 주기적인 신호를 만들 때
|
|   wfm 신호명 시작시간=신호값(주기시간=값 주기시간=값 .....)*반복횟수
|
|   wfm signal1 @0=0 (10ns=1 10ns=0)*4
|
|   신호 signal1은 0ns 일때 '0' 이고 10ns마다 '1'과 '0'을 반복하는 파형을
|   4개 만드는 것을 보여준다.
|
|   wfm clk 0=0 ((1000=1 1000=0)*4 500=1 500=0)*3
|
|   신호 clk는 0ns일때 '0'이고 100ns마다 '1'과 '0'을 반복하는 파형을 4개와
|   50ns일때 '1'과 그 후 50ns때 '0'이 되는 파형 3개를 만듬.
|
| 4. 다양한 사용방법.
|
|       wfm sig1 0=FF\H (1000=rl by 1)*10  --- rotate left
|       wfm sig1 0=FF\H (1000=rr by 1)*10  --- rotate right
|       wfm sig1 0=FF\H (1000=sl by 1)*10  --- shift left
|       wfm sig1 0=FF\H (1000=sr by 1)*10  --- shift right
|
|***** 필요시 on-line help를 참조하여 작업할 것. *****
|
|------- 'break' command ---------------------------------
| Please consult users guide or on-line help.  This command is
| a powerful way to monitor you simulation and insert stimulus
| if a certain event occurs:
| Examples:
|
| break - deletes (turns off) all breakpoints
| break clock - deletes all breakpoints on clock signal
|
| break clock ?         - stops simulation after any clock transition
|
| break enable Z-X      - stops simulation when the enable signal changes
| from High_Z to Unknown_X
|
| break clock 0-1 do (assign < DATAfile.dat; print) - stops simulation
| when the clock transitions from low to High and then assigns signal
| DATA a new value from file.dat. Next, it prints the new state of all
| signals.
|
|***** 필요시 on-line help를 참조하여 작업할 것. *****
|
|===================== Start of the simulation stimulus =====================
|
| 로직의 상태는 이름(HIGH, LOW 등등)이나 숫자(0,1)로서 표현이 된다.
| 버스로직상태도 이름 또는 숫자의 행렬로서 표현된다.
| 가장 왼쪽에 있는 이름이나 숫자는 최상의 버스신호값이 된다.
| 만약 버스신호의 크기보다 작은 신호값을 주면, 자동적으로 상위비트
| 값은 0 또는 LOW 신호로 채워진다. 한개의 신호는 한개의 신호선을
| 가지는 버스로 취급된다.
|
| 버스는 Binary는 (\B)로 Octal은 (\O)로 Decimal은 (\D)로 Hexadecimal은
| (\H)로 표현이 된다. 만일 아무런 표현이 되지 않으면 binary로 간주한다.
| 이러한 format은 그들의 숫자배수를 사용하여 표현될수도 있다.
| e.g. \2, \8, \16, \20.
|
| Examples of bus values:
|
|  11100010101 binary bus representation        | -- 이진 버스표현
|  100010101\B binary bus representation        | -- 이진 버스표현
|  1234\8  octal bus representation             | -- 팔진 버스표현
|  777\O   octal bus representation             | -- 팔진 버스표현
|  eff3ab\16   hexadecimal bus representation   | -- 16진 버스표현
|  10010101\H  hexadecimal bus representation   | -- 16진 버스표현
|  99999\D decimal bus representation           | -- 10진 버스표현
|  abcdefg\20  base 20 numbering system         | -- 20진 버스표현
|------------------------------------------------------------------
| 'print' file_name.dat 는 'watch' 명령에 의해 나열된 신호들의
| 결과를 file_name.dat 라는 파일에 출력한다.
| 'print' 는 그 명령이 사용된 그 시간까지의 자료를 저장한다.
| 여러시간의 값을 저장하려면 print command을 여러번 사용하라.
|
print sim_out.out
|------------------------------------------------------------------
|
| 'high' 또는 'h' 그리고 'low' 또는 'l' 은 개별적인 신호의 high
| 또는 low을 설정할 때 사용한다. 'x' 는 신호에 unknown을 설정할
| 때 사용한다.
|
| Timing Simulation시 실제 보드의 디자인이 초기동작을 할때에 모든
| Register가 Reset이 되어지는 효과를 보기 위하여 simulator에 전용
| reset signal을 삽입하여야 한다.
|
|       * SimGlobalReset -- FPGA용 Global Reset Signal
|       * PRLD -- CPLD (XC9500 only)용 Global Reset Signal
|
| 위의 두 신호은 high 일때 모든 Flip-Flop을 초기화 시킨다.
| 다른 말로는 active-high 동작을 한다.
h SimGlobalReset
h PRLD
cycle 3
print sim_out.out
l SimGlobalReset
l PRLD
cycle
print sim_out.out
|--------------------------
| 'cycle n' 명령은 'n' clock cycles 만큼 simulation 한다. 여기서
| n 은 숫자를 정의한다. 여러개의 clock을 선언했으면 그 중에서
| 가장 주기가 긴 clock을 한 주기로 계산하여 1 cycle을 실행.
|
| 'sim xx.xxns' 는 정의한 시간만큼 simulation 한다.
|
| 'run n' 는 'n' clock cycles 만큼 simulation 한다.
sim 100.0ns
| 'h' 또는 'high' 는 신호에 logical '1' 을 할당한다.
h I_CLK_EN
print sim_out.out
sim 300.0ns
|assign INDAT_VEC 02\H
sim 100ns
h I_CE
print sim_out.out
cycle
| 'l' 또는 'low' 는 신호에 logical '0' 을 할당한다.
l I_CE
l B_IO
cycle
print sim_out.out
l I_OE
|------------------------------------------------------------------
| 양방향 I/O 또는 busses 를 simulation할 때 'release' 명령이 쾌 유용하다.
| 'r' or 'release'명령은 신호를 stimulator control 에서 풀어 준다.
| 양방향 버스 또는 신호가 chip에 의해 구동되어질 때, 양방향 버스 또는
| 신호의 값을 볼 때 사용되곤 한다. 여러분은 버스나 핀(pin)에
| 'h', 'l', 또는 'assign' 명령을 사용하여 stimulator 를 다시 넣을 수 있다.
| 여기서 stimulator 는 신호에 어떤 패턴 또는 값을 할당하는 것을 말한다.
|
| "B_IO" 라는 양방향 신호를 생각해보자. 출력 신호인 "DOUT" 이 Tri-state
| buffer의 입력에 걸리고 그 출력이 B_IO 신호에 걸리며 tri-state buffer의
| enable singal을 t_en 이라 하자. B_IO 신호가 input buffer의 입력에 걸리고
| 그 input buffer의 출력을 Dual_I라 하면 이렇때 어떤식으로 command file
| 을 만들 것인가. 여기서 tri-state buffer 의 enable signal는 active-low로
| 동작한다고 가정한다.
|
| 먼저 입력을 생각해 보자
| assign B_IO 1
| assign t_en 1
| sim 100 ns
| 위의 command 가 수행되면 Dual_I 는  logical '1' 이 될 것이다.
| 이 상태에서 t_en 이 '0' 가 되고 DOUT 신호가 '0'이 되면 어떤 현상이 나타날까?
| 아마도 B_IO는 '1'을 유지하고 있을 것이다. 이때 release 명령을 사용한다.
| release B_IO
| assign t_en 0
| assign DOUT 0
| sim 100 ns
|
| * 좀 더 자세한 내용이 필요하면 아래 홈페이지 주소로 오세요. *
| * http://www.PLDWorld.com *
| * 위의 주소에 접속하여 기술자료란에서 필요한 자료를 받아가세요. *
|
r B_IO
cycle
h I_OE
cycle 2
print sim_out.out
h B_IO
cycle 2
print sim_out.out
|==================================================================
| Other commands to know of....
|------------------------------------------------------------------
| 'chk_design' 명령은 기존에 저장한 simulation 결과와 현재 simulation
| 결과가 같은지를 알기위해 비교할 때 사용한다.
| Please see the online help of further details on this command.
|                  chk_design design_name
|                  chk_design c:\Perv_design\design_name
|                  chkds design_name
| Along the same lines is the 'chk_results' command.  This command
| compaires the results of the output files form the simulator for
| two designs.  Please see the on-line help for more details.
|        chk_results reference_file1 reference_file2 compsn_results_file
|          chk_results reference_file1 reference_file2
|
|------------------------------------------------------------------
| 'delete_signals' 또는 'dels' 명령은 waveform viewer 에서 신호를 지운다.
|
|------------------------------------------------------------------
| 'execute' 또는 'ex' 명령은 다른 command file 을 수행한다.
| 이것은 사용자가 중첩된 command file을 쉽게 사용하게 한다.
| The syntax is:
|                  ex file_name.cmd
|
|------------------------------------------------------------------
| 'network' 또는 'net' 명령은 simulator 로 다른 netlist 을 불러 온다.
|                  net fifo_des
|------------------------------------------------------------------
| 여러분은 simulation function을 반복하기 위하여 Macro을 사용할 수 있다.
|
| Example:
|(assign A <a.dat; assign B <b.dat; sim; print results.dat) * 12
|
| 이 macro는 다음 동작을 12번 반복할 것이다.
|
|  assign to the signal (bus) A the next value listed in the a.dat |   file
|  assign to the signal (bus) B the next value listed in the b.dat |   file
|  simulate one simulation step
|  watch 명령어로 나열된 신호들을 results.dat file에 써라.
|  처음 동작을 반복하라.
|
|==================================================================
| end simulation
|

뒤로...


파일명: EXAMPLE.CMD (14,485 bytes)

  Send to a colleague | Print this document