如何使用ModelSim對Megafunction或LPM作仿真? (SOC) (MegaCore) (ModelSim)

原网页地址:http://www.cnblogs.com/oomusou/archive/2009/02/17/modelsim_megafunction.html

Abstract
在FPGA開發中,常會用到Altera所提供的Megafunction與LPM加速開發,這要如何使用ModelSim作仿真呢?

Introduction
使用環境:Quartus II 8.1 + ModelSim-Altera 6.3g_p1 + ModelSim SE 6.3e

(筆記) 如何使用ModelSim作前仿真與後仿真? (SOC) (Quartus II) (ModelSim)中,提到如何使用ModelSim對Verilog作仿真,包含前仿真與後仿真,若使用了Altera的Megafunction與LPM,則仿真的方法稍有不同,本文分別使用ModelSim-Altera與ModelSim SE,並對Megafunction:dcfifo作仿真。

my_dcfifo.v / Verilog
使用MegaWizard產生的dcfifo。

复制代码
  1  //  megafunction wizard: %FIFO%
  2  //  GENERATION: STANDARD
  3  //  VERSION: WM1.0
  4  //  MODULE: dcfifo 
  5 
  6  //  ============================================================
  7  //  File Name: my_dcfifo.v
  8  //  Megafunction Name(s):
  9  //              dcfifo
10  //
11  //  Simulation Library Files(s):
12  //              altera_mf
13  //  ============================================================
14  //  ************************************************************
15  //  THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
16  //
17  //  8.1 Build 163 10/28/2008 SJ Full Version
18  //  ************************************************************
19 
20 
21  // Copyright (C) 1991-2008 Altera Corporation
22  // Your use of Altera Corporation's design tools, logic functions 
23  // and other software and tools, and its AMPP partner logic 
24  // functions, and any output files from any of the foregoing 
25  // (including device programming or simulation files), and any 
26  // associated documentation or information are expressly subject 
27  // to the terms and conditions of the Altera Program License 
28  // Subscription Agreement, Altera MegaCore Function License 
29  // Agreement, or other applicable license agreement, including, 
30  // without limitation, that your use is for the sole purpose of 
31  // programming logic devices manufactured by Altera and sold by 
32  // Altera or its authorized distributors.  Please refer to the 
33  // applicable agreement for further details.
34 
35 
36  //  synopsys translate_off
37  `timescale  1  ps  /   1  ps
38  //  synopsys translate_on
39  module  my_dcfifo (
40      aclr,
41      data,
42      rdclk,
43      rdreq,
44      wrclk,
45      wrreq,
46      q,
47      rdempty,
48      rdusedw,
49      wrfull);
50 
51       input       aclr;
52       input     [ 7 : 0 ]  data;
53       input       rdclk;
54       input       rdreq;
55       input       wrclk;
56       input       wrreq;
57       output     [ 7 : 0 ]  q;
58       output       rdempty;
59       output     [ 4 : 0 ]  rdusedw;
60       output       wrfull;
61 
62       wire   sub_wire0;
63       wire   sub_wire1;
64       wire  [ 7 : 0 ] sub_wire2;
65       wire  [ 4 : 0 ] sub_wire3;
66       wire   rdempty  =  sub_wire0;
67       wire   wrfull  =  sub_wire1;
68       wire  [ 7 : 0 ] q  =  sub_wire2[ 7 : 0 ];
69       wire  [ 4 : 0 ] rdusedw  =  sub_wire3[ 4 : 0 ];
70 
71      dcfifo    dcfifo_component (
72                  .wrclk (wrclk),
73                  .rdreq (rdreq),
74                  .aclr (aclr),
75                  .rdclk (rdclk),
76                  .wrreq (wrreq),
77                  .data (data),
78                  .rdempty (sub_wire0),
79                  .wrfull (sub_wire1),
80                  .q (sub_wire2),
81                  .rdusedw (sub_wire3)
82                   //  synopsys translate_off
83                  ,
84                  .rdfull (),
85                  .wrempty (),
86                  .wrusedw ()
87                   //  synopsys translate_on
88                  );
89       defparam
90          dcfifo_component.intended_device_family  =   " Cyclone II " ,
91          dcfifo_component.lpm_hint  =   " MAXIMIZE_SPEED=5, " ,
92          dcfifo_component.lpm_numwords  =   32 ,
93          dcfifo_component.lpm_showahead  =   " OFF " ,
94          dcfifo_component.lpm_type  =   " dcfifo " ,
95          dcfifo_component.lpm_width  =   8 ,
96          dcfifo_component.lpm_widthu  =   5 ,
97          dcfifo_component.overflow_checking  =   " ON " ,
98          dcfifo_component.rdsync_delaypipe  =   4 ,
99          dcfifo_component.underflow_checking  =   " ON " ,
100          dcfifo_component.use_eab  =   " ON " ,
101          dcfifo_component.write_aclr_synch  =   " OFF " ,
102          dcfifo_component.wrsync_delaypipe  =   4 ;
103 
104 
105  endmodule
106 
107  //  ============================================================
108  //  CNX file retrieval info
109  //  ============================================================
110  //  Retrieval info: PRIVATE: AlmostEmpty NUMERIC "0"
111  //  Retrieval info: PRIVATE: AlmostEmptyThr NUMERIC "-1"
112  //  Retrieval info: PRIVATE: AlmostFull NUMERIC "0"
113  //  Retrieval info: PRIVATE: AlmostFullThr NUMERIC "-1"
114  //  Retrieval info: PRIVATE: CLOCKS_ARE_SYNCHRONIZED NUMERIC "0"
115  //  Retrieval info: PRIVATE: Clock NUMERIC "4"
116  //  Retrieval info: PRIVATE: Depth NUMERIC "32"
117  //  Retrieval info: PRIVATE: Empty NUMERIC "1"
118  //  Retrieval info: PRIVATE: Full NUMERIC "1"
119  //  Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone II"
120  //  Retrieval info: PRIVATE: LE_BasedFIFO NUMERIC "0"
121  //  Retrieval info: PRIVATE: LegacyRREQ NUMERIC "1"
122  //  Retrieval info: PRIVATE: MAX_DEPTH_BY_9 NUMERIC "0"
123  //  Retrieval info: PRIVATE: OVERFLOW_CHECKING NUMERIC "0"
124  //  Retrieval info: PRIVATE: Optimize NUMERIC "2"
125  //  Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
126  //  Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
127  //  Retrieval info: PRIVATE: UNDERFLOW_CHECKING NUMERIC "0"
128  //  Retrieval info: PRIVATE: UsedW NUMERIC "1"
129  //  Retrieval info: PRIVATE: Width NUMERIC "8"
130  //  Retrieval info: PRIVATE: dc_aclr NUMERIC "1"
131  //  Retrieval info: PRIVATE: diff_widths NUMERIC "0"
132  //  Retrieval info: PRIVATE: msb_usedw NUMERIC "0"
133  //  Retrieval info: PRIVATE: output_width NUMERIC "8"
134  //  Retrieval info: PRIVATE: rsEmpty NUMERIC "1"
135  //  Retrieval info: PRIVATE: rsFull NUMERIC "0"
136  //  Retrieval info: PRIVATE: rsUsedW NUMERIC "1"
137  //  Retrieval info: PRIVATE: sc_aclr NUMERIC "0"
138  //  Retrieval info: PRIVATE: sc_sclr NUMERIC "0"
139  //  Retrieval info: PRIVATE: wsEmpty NUMERIC "0"
140  //  Retrieval info: PRIVATE: wsFull NUMERIC "1"
141  //  Retrieval info: PRIVATE: wsUsedW NUMERIC "0"
142  //  Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II"
143  //  Retrieval info: CONSTANT: LPM_HINT STRING "MAXIMIZE_SPEED=5,"
144  //  Retrieval info: CONSTANT: LPM_NUMWORDS NUMERIC "32"
145  //  Retrieval info: CONSTANT: LPM_SHOWAHEAD STRING "OFF"
146  //  Retrieval info: CONSTANT: LPM_TYPE STRING "dcfifo"
147  //  Retrieval info: CONSTANT: LPM_WIDTH NUMERIC "8"
148  //  Retrieval info: CONSTANT: LPM_WIDTHU NUMERIC "5"
149  //  Retrieval info: CONSTANT: OVERFLOW_CHECKING STRING "ON"
150  //  Retrieval info: CONSTANT: RDSYNC_DELAYPIPE NUMERIC "4"
151  //  Retrieval info: CONSTANT: UNDERFLOW_CHECKING STRING "ON"
152  //  Retrieval info: CONSTANT: USE_EAB STRING "ON"
153  //  Retrieval info: CONSTANT: WRITE_ACLR_SYNCH STRING "OFF"
154  //  Retrieval info: CONSTANT: WRSYNC_DELAYPIPE NUMERIC "4"
155  //  Retrieval info: USED_PORT: aclr 0 0 0 0 INPUT GND aclr
156  //  Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL data[7..0]
157  //  Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL q[7..0]
158  //  Retrieval info: USED_PORT: rdclk 0 0 0 0 INPUT NODEFVAL rdclk
159  //  Retrieval info: USED_PORT: rdempty 0 0 0 0 OUTPUT NODEFVAL rdempty
160  //  Retrieval info: USED_PORT: rdreq 0 0 0 0 INPUT NODEFVAL rdreq
161  //  Retrieval info: USED_PORT: rdusedw 0 0 5 0 OUTPUT NODEFVAL rdusedw[4..0]
162  //  Retrieval info: USED_PORT: wrclk 0 0 0 0 INPUT NODEFVAL wrclk
163  //  Retrieval info: USED_PORT: wrfull 0 0 0 0 OUTPUT NODEFVAL wrfull
164  //  Retrieval info: USED_PORT: wrreq 0 0 0 0 INPUT NODEFVAL wrreq
165  //  Retrieval info: CONNECT: @data 0 0 8 0 data 0 0 8 0
166  //  Retrieval info: CONNECT: q 0 0 8 0 @q 0 0 8 0
167  //  Retrieval info: CONNECT: @wrreq 0 0 0 0 wrreq 0 0 0 0
168  //  Retrieval info: CONNECT: @rdreq 0 0 0 0 rdreq 0 0 0 0
169  //  Retrieval info: CONNECT: @rdclk 0 0 0 0 rdclk 0 0 0 0
170  //  Retrieval info: CONNECT: @wrclk 0 0 0 0 wrclk 0 0 0 0
171  //  Retrieval info: CONNECT: rdempty 0 0 0 0 @rdempty 0 0 0 0
172  //  Retrieval info: CONNECT: rdusedw 0 0 5 0 @rdusedw 0 0 5 0
173  //  Retrieval info: CONNECT: wrfull 0 0 0 0 @wrfull 0 0 0 0
174  //  Retrieval info: CONNECT: @aclr 0 0 0 0 aclr 0 0 0 0
175  //  Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
176  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo.v TRUE
177  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo.inc FALSE
178  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo.cmp FALSE
179  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo.bsf FALSE
180  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo_inst.v FALSE
181  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo_bb.v TRUE
182  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo_waveforms.html TRUE
183  //  Retrieval info: GEN_FILE: TYPE_NORMAL my_dcfifo_wave*.jpg TRUE
184  //  Retrieval info: LIB_FILE: altera_mf
复制代码


my_dcfifo_tb.v / Verilog
dcfifo的testbench。

复制代码
1  /*  
2  (C) OOMusou 2009  http://oomusou.cnblogs.com
3 
4  Filename    : my_dcfifo_tb.v
5  Compiler    : ModelSim-Altera 6.3g
6  Description : dcfifo testbench
7  Release     : 02/17/2009 1.0
8  */
9  `timescale  1  ns / 100  ps
10 
11  module  my_dcfifo_tb;
12 
13  parameter  WRPERIOD  =   10 ;
14  parameter  RDPERIOD  =   8 ;
15 
16  //  write side
17  reg         aclr;
18  reg         wrclk;
19  reg         wrreq;
20  reg   [ 7 : 0 ] data;
21  wire        wrfull;
22 
23  //  read side
24  reg         rdclk;
25  reg         rdreq;
26  wire  [ 7 : 0 ] q;
27  wire        rdempty;
28  wire  [ 4 : 0 ] rdusedw;
29 
30  my_dcfifo my_dcfifo0 (
31    .aclr(aclr),
32    .wrclk(wrclk),
33    .wrreq(wrreq),
34    .data(data),
35    .wrfull(wrfull),
36    .rdclk(rdclk),
37    .rdreq(rdreq),
38    .q(q),
39    .rdempty(rdempty),
40    .rdusedw(rdusedw)
41  );
42 
43  initial   begin
44    # 0   aclr  =   1 ' b0;
45        wrclk  =   1 ' b0;
46        wrreq  =   1 ' b1;
47        data   =   8 ' h00;
48        rdclk  =   1 ' b0;
49        rdreq  =   1 ' b0;
50    # 30  rdreq  =   1 ' b1;
51    # 70  rdreq  =   1 ' b0;
52    # 50  rdreq  =   1 ' b1;
53  end
54 
55  //  wr clk
56  always  #(WRPERIOD / 2 ) wrclk  =   ~ wrclk;
57 
58  //  wr data
59  always @( posedge  wrclk,  posedge  aclr)  begin
60     if  (aclr) 
61      data  <=   8 ' h00;
62     else   begin
63      data  <=  data  +   8 ' h01;
64     end
65  end
66 
67  //  rd clk
68  always  #(RDPERIOD / 2 ) rdclk  =   ~ rdclk;
69 
70  endmodule
复制代码


使用ModelSim-Altera與其自帶的precompiled library作仿真
使用GUI
Step 1:
改變預設目錄

File -> Change Directory

Step 2:
建立work library

Step 3:
編譯Verilog

Compile -> Compile ...

modelsim_ae11 

Step 4:
開始仿真

Simulate -> Start Simulation

在Design tab指定testbench。

modelsim_ae08

在Libraries tab,將Altera的precompiled library加入,220model是LPM、而altera_mf是Megafunction的precompiled library。完整的說明請參考ModelSim Precompiled Libraries

modelsim_ae09

Step 5:
加入觀察信號

在Objects window按滑鼠右鍵,Add to Wave -> Signals in Region

Step 6:
執行仿真

設定300 ns,run。

modelsim_ae10

使用TCL script

Step 2到Step 6的GUI,可使用以下TCL script取代。

复制代码
1  # create work library
2  vlib work
3 
4  # compile
5  vlog my_dcfifo . v
6  vlog my_dcfifo_tb . v
7 
8  # simulate
9  vsim -L C: / altera / 81 / modelsim_ae / altera / verilog / 220model -L C: / altera / 81 / modelsim_ae / altera / verilog / altera_mf work . my_dcfifo_tb
10 
11  # probe signals
12  add wave sim: / my_dcfifo_tb / aclr
13  add wave sim: / my_dcfifo_tb / wrclk
14  add wave sim: / my_dcfifo_tb / wrreq
15  add wave -literal -radix decimal sim: / my_dcfifo_tb / data
16  add wave sim: / my_dcfifo_tb / wrfull
17  add wave sim: / my_dcfifo_tb / rdclk
18  add wave sim: / my_dcfifo_tb / rdreq
19  add wave -literal -radix decimal sim: / my_dcfifo_tb / q
20  add wave sim: / my_dcfifo_tb / rdempty
21  add wave -literal -radix decimal sim: / my_dcfifo_tb / rdusedw
22 
23  # 300  ns
24  run   300  ns
复制代码


使用ModelSim SE,每次仿真自行編譯Megafunction與LPM
若沒安裝ModelSim-Altera,只安裝ModelSim SE,就沒有Altera提供的precompiled library可用,這時若要對有使用Megafunction與LPM的code作仿真,就必須自行編譯。

使用GUI
Step 1:
將220mdel.v與altera_mf.v複製到目錄下

C:\altera\81\quartus\eda\sim_lib\目錄下的220model.v與altera_mf.v複製到專案目錄下。

Step 2:
改變預設目錄

File -> Change Directory

Step 3:
建立work library

Step 4:
編譯Verilog

modelsim_ae12

編譯220model.v與altera_mf.v需要一些時間。

Step 5:
開始仿真

Simulate -> Start Simulation

在Design tab指定testbench,與ModelSim-Altera不一樣的是不能勾選Enable optimization,因為選了之後,所有在Objects window的信號會被優化掉,而無法選取。

modelsim_ae13 

Step 6:
加入觀察信號

在Objects window按滑鼠右鍵,Add to Wave -> Signals in Region

Step 7:
執行仿真

設定300 ns,run。

modelsim_ae10

使用TCL script

Step 2到Step 7的GUI,可使用以下TCL script取代。

复制代码
1  # create work library
2  vlib work
3 
4  # compile
5  vlog my_dcfifo . v
6  vlog my_dcfifo_tb . v
7  vlog 220model . v
8  vlog altera_mf . v
9 
10  # simulate
11  vsim -novopt work . my_dcfifo_tb
12 
13  # probe signals
14  add wave sim: / my_dcfifo_tb / aclr
15  add wave sim: / my_dcfifo_tb / wrclk
16  add wave sim: / my_dcfifo_tb / wrreq
17  add wave -literal -radix decimal sim: / my_dcfifo_tb / data
18  add wave sim: / my_dcfifo_tb / wrfull
19  add wave sim: / my_dcfifo_tb / rdclk
20  add wave sim: / my_dcfifo_tb / rdreq
21  add wave -literal -radix decimal sim: / my_dcfifo_tb / q
22  add wave sim: / my_dcfifo_tb / rdempty
23  add wave -literal -radix decimal sim: / my_dcfifo_tb / rdusedw
24 
25  # 300  ns
26  run   300  ns
复制代码


使用ModelSim SE,將Megafunction與LPM編譯成library,日後不必重新編譯
以上的方法雖可行,不過必須每次重新編譯Megafunction與LPM,較花時間,可將Megafunction與LPM先獨立編譯成library,以後就不用重新編譯。

使用GUI
Step 1:
建立獨立altera_lib目錄,將220model.v與altera_mf.v複製到此目錄。

Step 2:
改變預設目錄到altera_lib

File -> Change Directory

Step 3:
建立LPM library

modelsim_ae14

Step 4:
編譯Verilog

modelsim_ae15

需要一些時間編譯。

Step 5:
建立Megafunction library

modelsim_ae16

Step 6:
編譯Verilog

modelsim_ae17

需要一些時間編譯,如此已經建立好2個library。

Step 7:
改變預設目錄到含my_dcfifo.v與my_dcfifo_tb.v的目錄

File -> Change Directory

Step 8:
建立work library

Step 9:
編譯Verilog

Step 10:
開始仿真

Simulate -> Start Simulation

在Design tab指定testbench,與ModelSim-Altera不一樣的是不能勾選Enable optimization,因為選了之後,所有在Objects window的信號會被優化掉,而無法選取。

modelsim_ae18

在Libraries tab加入剛剛編譯的lib。

modelsim_ae19

此時速度就很快,因為LPM與Megafunction兩個lib已經編譯過了。

Step 11:
加入觀察信號

在Objects window按滑鼠右鍵,Add to Wave -> Signals in Region

Step 12:
執行仿真

設定300 ns,run。

modelsim_ae10

使用TCL script
Step 3到Step 6的GUI,可使用以下TCL script取代。

复制代码
1  # create LPM library
2  vlib LPM
3 
4  # compile 220model . v
5  vlog -work LPM 220model . v
6 
7  # create Megafunction
8  vlib Megafunction
9 
10  # compile altera_mf . v
11  vlog -work Megafunction altera_mf . v
复制代码


Step 8到Step 12的GUI,可使用以下TCL script取代。

复制代码
1  # create work library
2  vlib work
3 
4  # compile
5  vlog my_dcfifo . v
6  vlog my_dcfifo_tb . v
7 
8  # simulate
9  vsim -novopt -L D: / 0Clare / VerilogLab / ModelSim / altera_lib_tcl / LPM -L D: / 0Clare / VerilogLab / ModelSim / altera_lib_tcl / Megafunction work . my_dcfifo_tb
10 
11  # probe signals
12  add wave sim: / my_dcfifo_tb / aclr
13  add wave sim: / my_dcfifo_tb / wrclk
14  add wave sim: / my_dcfifo_tb / wrreq
15  add wave -literal -radix decimal sim: / my_dcfifo_tb / data
16  add wave sim: / my_dcfifo_tb / wrfull
17  add wave sim: / my_dcfifo_tb / rdclk
18  add wave sim: / my_dcfifo_tb / rdreq
19  add wave -literal -radix decimal sim: / my_dcfifo_tb / q
20  add wave sim: / my_dcfifo_tb / rdempty
21  add wave -literal -radix decimal sim: / my_dcfifo_tb / rdusedw
22 
23  # 300  ns
24  run   300  ns
复制代码


使用ModelSim SE,將Megafunction與LPM所編譯的library建立永久的library mapping
既然已經為LPM與Megafunction建立了library,可以透過(筆記) 如何為ModelSim加入永久性的library mapping? (SOC) (ModelSim)的技巧,建立永久的library mapping。將C:\Modeltech_6.3e\modelsim.ini修改成如下所示:

复制代码
1  ;  Copyright  1991 - 2008  Mentor Graphics Corporation
2  ;
3  ;  All Rights Reserved .
4  ;
5  ;  THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF 
6  ;  MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS .
7  ;    
8 
9  [Library]
10  LPM  =  D: / 0Clare / VerilogLab / ModelSim / altera_lib / LPM
11  Megafunction  =  D: / 0Clare / VerilogLab / ModelSim / altera_lib / Megafunction
12  std  =   $ MODEL_TECH /../ std
13  ieee  =   $ MODEL_TECH /../ ieee
14  verilog  =   $ MODEL_TECH /../ verilog
15  vital2000  =   $ MODEL_TECH /../ vital2000
16  std_developerskit  =   $ MODEL_TECH /../ std_developerskit
17  synopsys  =   $ MODEL_TECH /../ synopsys
18  modelsim_lib  =   $ MODEL_TECH /../ modelsim_lib
19  sv_std  =   $ MODEL_TECH /../ sv_std
20  mtiAvm  =   $ MODEL_TECH /../ avm
21  mtiUPF  =   $ MODEL_TECH /../ upf_lib
22  ; vhdl_psl_checkers  =   $ MODEL_TECH /../ vhdl_psl_checkers        //  Source  files  only  for  this release
23  ; verilog_psl_checkers  =   $ MODEL_TECH /../ verilog_psl_checkers  //  Source  files  only  for  this release
复制代码


第10行與第11行就是所加入的library mapping。如此只要一執行ModelSim SE,就可以看到LPM與Megafunction都已經mapping上了。

modelsim_ae20

之後的模擬與之前的介紹一樣,唯library選擇比較方便。

modelsim_ae21



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值