发新话题
打印

PLI FAQ

PLI FAQ

A. General  
2 B+ W' k  M; n5 p( v( o9 D
- k/ n2 \4 x0 d6 cA.1 什么是Verilog的PLI?
. a6 }0 H9 C' U+ A' X4 K
9 e0 A# u" m5 W$ }可编程语言接口(PLI)  is a mechanism to interface Verilog programs with programs written in C language. It also provides mechanism to access internal databases of the simulator from the C program.
9 S8 O0 f7 g3 b% W- R- n
" M$ P2 G) w' O7 _. SA.2 Why is it used for ? ) ]7 y+ e& }! j# E1 f5 [
PLI is used for implementing system calls which would have been hard to do otherwise (or impossible) using Verilog syntax. Or, in other words, you can take advantage of both the paradigms - parallel and hardware related features of Verilog and sequential flow of C - using PLI." O5 C* }4 n+ P7 d5 D/ e1 n

& I' \& t; w7 p% j: @" D* p% t& mA.3 Verilog PLI应用最频繁的是什么? & G3 V7 v# V$ I7 u; e6 D! N
PLI最通用的应用的是延时反标,编写延时计算器和开发用户界面。2 f/ a1 ]3 K8 F6 u6 U

% ~4 Q# Y9 s$ ~( MA.4 等等,等等。我是一个VHDL用户,已经impressed。有没有VHDL PLI?
1 G3 s* u$ r+ V  v8 A( r( E7 lVHDL does not have a PLI (one more reason for you to switch to Verilog), although preliminary proposals are there for standardizing such an interface.
. Q% A* n/ M0 [/ H6 J
" a. Y8 U9 m5 C( D( }, H/ YA.5 Gee! Is there anything that PLI does NOT allow ?
8 K! v- i0 G* {6 J( X; D3 {; e$ d3 wVerilog PLI does not permit anything goes against the rules of the language. You can not, for instance, assign a value to a wire, just as you can not do that in Verilog program either. Apart from these, there are few things that Verilog PLI does not allow; most notable among them are : you can not create an object and you do not have access to compiler directives (although, in most cases you can see their effects). ; L& G* k+ h% n+ c8 q! V1 f  i+ F

2 p( V/ t6 l- n4 uA.6 I heard PLI applications slow down the simulation and make the simulation environment clumsy ? 2 c$ K' C' l' n5 N- J- t
Alice: "Mr. Rabbit, can you tell me where does this road go ?" 7 U/ r" C- P' V/ ]
Mr. Rabbit: "That depends on where you want to go."
+ m& J. c# \# FWe have been asked this question several times. Over the years, we figured out there is no definite answer to this question as there is no clear benchmark available. We will also explain why the question itself is not well-defined below. The above question usually takes two forms. First, if I write a PLI application and use it in my simulation, does that slow down the simulation ? The answer is of course yes , just as any other added code would do in any other programming language. However, if you do not use the PLI application in your Verilog model, the answer depends on a lot what the application does and which simulator you use. See for example, this answer .
+ a% [4 G; \2 b7 `2 J. `- G- D1 t# ]+ }+ n" g/ d: V: Z5 b$ c' L# L& V
The second variation is if I write a C model and then use PLI to integrate it with main Verilog source, will that be faster than the corresponding Verilog model ? Here also it depends on which simulator you are using and what your model does. This is an answer from one of the Verilog simulator vendors. ! f2 Z$ ~2 r3 @9 U3 A1 X/ f
1 |; y$ Q( `+ a0 \* X' q; o0 J! @
Having said that, for most of the applications that we have seen, our emperical judgement is that any simulation performance degradation due to PLI is not that big as long as the applications themselves are well-written and do not violate basic programming rules.
' r8 R( k3 ^, Q; k- V8 U; D1 d
  T# K7 u$ X5 X" GB.资源   + G' Q  s9 Q" N  H  F. X3 T

' k& Q+ }: L7 Q% wB.1 有没有有关Verilog PLI的书?8 H2 _! Y8 B/ L" p( F8 A. b$ z

4 v2 g; ~+ \- E' S  D- _! T2本有关 Verilog PLI的书。, X9 a9 q1 @0 n! N7 f
Principles of Verilog PLI
0 m' N7 [$ ]; f# Q& cSwapnajit Mittra - h2 u; _3 ~' \; b8 J
Kluwer Academic Publishers, Norwell MA
) T4 Z" z9 S/ Y: B8 ?8 @9 OISBN: 0-7923-8477-6 ) V7 Z3 H2 d; @( I

( |' m" J  }1 f0 ^Using the Verilog PLI: A Tutorial and Reference
: a: i2 q/ x9 O1 lStuart Sutherland
0 r' m- Y. D1 k$ {Kluwer Academic Publishers, Norwell MA
7 M# E$ ?4 \5 Q9 P2 Q8 T6 K8 s! V- L! `1 N2 y0 ~- Q- p
其他的Verilog PLI资源有2个标准手册。  x7 B  V1 C7 q/ W
3 C4 Z) }) N2 ]1 Y+ q5 H2 j
IEEE Std 1364-1995 : IEEE Standard Hardware Description Language based on the Verilog Hardware Description Language + V/ Q; m7 S# l; U+ f
Published by the IEEE, Inc., 345 East 47th Street, New York, NY 10017, USA / b  \5 \6 A* V1 O9 |
ISBN 1-55937-727-5
/ t# P  u0 n9 O, ?9 g
9 U! z0 O7 s9 {" t, `OPEN VERILOG INTERNATIONAL (OVI) PROGRAMMING LANGUAGE INTERFACE (PLI), Version 2.0
( }' ]" i- s' w. i$150 per copy, plus local sales tax
$ a+ j$ I5 Z' G2 q, g4 HOpen Verilog International
" o# v: d! B8 a0 \5 u# zLynn Horobin
% J: _2 o, J6 [. a" Y15466 Los Gatos Blvd., Suite 109-071 " B/ l% T0 G7 Y3 m; Y
Los Gatos, CA 95032
+ x, ~# l3 h$ t3 w( m4 fPhone: (408) 353-8899 -- FAX: (408) 353-8869
  N* N2 ^  a5 o. f/ w( Qe-mail: ovi@netcom.com : {! ^, Q1 n+ H

" d8 T; c# U, a  c- l
7 {/ `" y5 l- Y8 FB.2有没有关于PLI的网站?
( M* U' E1 Y; o: ]4 ^Well, you are reading one right now.
% g+ C0 s3 J" Y! n. h* MApart from this, here is an incomplete list: ' Q0 q4 y: [9 n% V8 N
A Brief Introduction to PLI 1 j  Z5 P& V, U" E9 F  x
# L/ K% h7 m1 D- q, \" }
C. Preparations   1 B7 e5 N7 b! h( W5 H, Q& |" i
+ o2 s% D; Y# |8 Y

; z; p; u/ Y' fC.1 I do not know C. Can I write a PLI application in any other language than C ? 2 o' ^1 P4 z7 J$ w0 ~

3 C% V. f; S! wThe answer to this question is "Yes" and "No". If you are not accessing design database (for example, if all that your program does is "Hello! World."), you can write it in any language, compile it to object code and link it to Verilog and other PLI C programs. However, if you are accessing the database (e.g. reading/writing some register etc.) you do not have much choice than to use C. This is because libraries have language bindings. + H% l6 s& o6 S) ~. S
Notice that, some simulators do support C++. The process of linking a C++ routine to these simulators varies. You need to look at the manuals of these simulators to find out how exactly the process works. See C.7 and C.8 for more details on this subject. % O" v6 P: F% ~8 |0 t7 t4 I' A5 e

+ K0 E2 Y' x$ q5 T+ e" \C.2 Why do not I see a main() in a PLI application ? ; m$ @. W" F0 R* E4 l3 L- Y
Because, your PLI routine is not an independent C program. It consists of C functions which are called by the actual main() function of the simulator (or one of its sub functions).
5 R# H* z# d) Y5 ]" u
; M1 w, c3 F/ m8 P3 O5 }C.3 What are s_tfcell and veriusertfs[] ? ; ]& @( K* w. z0 J  X( y* ^+ ?: B
s_tfcell is a predefined data structure defined as a structure to hold, among things, the type of the PLI routine (task or function) and names of the component functions. veriusertfs[] is an array of these structures.
# C  S. e5 D/ i" S6 T/ S$ j0 W2 \! m+ D
% G/ q  Z+ v6 t+ p" _$ kC.4 I use VCS and there is no such data structure as s_tfcell and veriusertfs[] in it. Why ? 1 h  a6 r" I2 f  v* `9 l
This is because VCS uses a file with the equivalent data in it. This file is normally called a table file.4 x; s8 X  M7 x( M& v" u9 f) N
! [( O9 `8 K% r
C.5 I saw veriuser.h as part of IEEE Std. 1364-1995. But my VCS distribution does not have it. What's wrong ?
6 L/ ?: Z( Y# U+ MVCS uses its own header file called vcsuser.h.. o/ G8 r! @- n+ F3 p! W

3 E4 f. P, l7 u$ g) C8 }( yC.6 What is a callback ? + ]7 |. m+ m: V
A callback is a mechanism to invoke a function when some other event occurs.4 q  t" \' r5 M  M; I+ Y: Z% E$ h

6 P! T' w; ]% a4 r+ y) EC.7 Can I write my PLI application in C++ ?
0 |& s* H" ~) J" iOne of the most favorite questions from our readers. The short answer is "Yes, in most cases". Click here for a longer one.
9 s' w2 M, K: d2 Y2 a; _
; S8 }  ^% M4 {1 O2 T/ z7 `, gC.8 Can I write my PLI application in Java ? # k( ^  {. u% X4 U/ n# d
There are two known interfaces between Verilog and Java.
# h7 M3 T& `5 tTime-rover Inc. sells a Java PLI interface enabling you to access the entire Java suite of packages. Click here to reach their website. * e2 c  ^+ W1 g
Newisys has released Jove, an open verification environment for the Java platform. Jove is a set of Java APIs and tools to enable Verilog hardware design verification of ASICs and FPGAs using the Java programming language. 1 p+ ]# v9 f+ ~2 ~+ X8 Z
, Y, |/ S/ U5 I9 {+ {- [4 l
C.9 Can I write my PLI application in Perl/Python ? 6 A3 c& E; j. n. L# H
There are at least 3 programs that support Perl interface to Verilog PLI. Two of them also support Python interface. Wilson Snyder has dedicated his Perl package Verilog_pli to the Verilog user community. It is available from his VeriPool webpage. A student project in Berkely named ScriptEDA has a Perl/Python interface. Lastly, NelSim Software provides an open source package that can be downloaded from their ScriptSim page. According to Nelsim, "ScriptSim does not involve linking an interpreter into the simulation. The interpreter runs outside the simulation, making it impossible for script errors to crash the simulator. It also allows the interpreter to create sophisticated GUIs without interfering with the simulation."
6 n2 K1 d0 g! X& t4 ^1 {; G7 _( F
$ Z9 Q) I5 R2 Y! c+ z* }/ u5 iD. Compilation  
& f, a4 p) _# ~: E0 [7 D1 w$ D5 W( A( g" W1 X4 v  e+ [
D.1 Does it matter if I use a 16 bit, 32 bit or 64 bit C compiler for compiling my application ? : N+ l% y8 ?1 v) ~+ i- f

) o. s* ^, D0 f- }0 J) @No. Internal variables of the simulators are independent of system specification. For example, integer is assumed to be 32 bit irrespective of whatever system you are using. 9 j8 Z" b0 X8 Z! z: z3 i
D.2 During compilation, I get an error message 5 E7 @( U! D& R- r
ld: Unresolved symbol: tf_... 6 v! b; k& G4 B1 p2 Y
Probably you forgot to include veriuser.h or one of its variants.
/ f0 w) s* C8 ~. F- y0 ~
. w8 E. d7 \' R5 r0 u: B1 t3 nD.3 During compilation, I get an error message , k/ p' |4 \( j
handle myHndl; ' q2 @( k/ A- I2 Z
Syntax error: at or near symbol myHndl
7 u; I3 n3 F9 w8 ~Probably you forgot to include acc_user.h .
4 Y; e' }6 ~2 e9 o+ [1 f" @% X, k5 b$ ^- z
D.4 During compilation, I am trying to port an application which was earlier used with Verilog-XL/NC, but during compilation I get the following error message: / L5 Y; H3 P4 H. B( g1 O& P2 m
vpi_user.h - include file not found. # K* e3 f- r9 H0 V; X- O2 P
Either you have not set the path correctly or you are trying to compile the application in an environment which does not support PLI2.0.
" Y$ h+ @8 o. x# P
$ \2 s6 A# [. O& `7 t7 SE. Libraries/Versions   
' p" p& }% {( {. M, g: w& N8 N0 _* H1 r

! ~/ Y- O# j' C2 H: v, X+ ^E.1 Given a choice, which of the three types of routines - TF, ACC and VPI - should I use for my application ? - i( E* S0 N9 f. B: m+ |$ ?1 P
% v/ D" ^/ B( {* \
It depends on a number of factors, including the nature of the application that you are writing and your own familiarity with the libraries. If the nature of the application allows you to use any of the three functions, it seems TF routines are faster.3 K4 L/ d0 B! H# t/ b1 C6 {+ B
4 X5 N3 D( C5 {' c/ w( c
E.2 Can I use libraries from both versions of PLI in the same application ?
% C5 N3 _! G$ K1 z0 c  \5 LYes, as long as you are including the right header files.
9 h  ~" n3 N  K( _) F5 [. }! V- e9 r! G- ~& k5 X
E.3 Are "handle"s interchangeable between PLI versions 1.0 and 2.0?
& v" m9 X/ \4 ^% ^Handles in PLI1.0 and 2.0 are of different types. The data type for PLI1.0 handle is handle, when the data type for 2.0 is vpi_handle. So, they can not be used interchangeably. However, Cadence Design Systems in its implementation of PLI2.0, provides two functions for converting handles from one type to the other.
( L+ r$ m  D: y/ }5 J' K8 W: W/ a  {. @# _- Q+ a' I! ?4 N* @% v
F. How do I ...?   ; G7 K8 L6 Z) }; I, H

# q! F8 k! ~6 i0 ^4 z* T) {  i, GF.1 如何从用户定义函数中返回值?
  n7 {* O; G, \6 k; v, N$ u使用tf_putp()或者 tf_strdelputp() 自变量 0, i.e. 3 B- K5 \/ a2 I! N) x. B5 l
tf_putp(0, ret_val);* O# _% y/ I3 m8 O

$ e% Z$ X9 f! @8 ^F.2 什么库函数可以读取寄存器的值呢?
# j, \6 _* m$ H9 ^( L) p, w3 xtf_getp() or tf_strgetp().
2 E* |/ i; Z4 @+ T& X( X# p6 p! T0 A
! H) T6 q) @- v$ S. S' m0 a0 MF.3 什么库函数可以写入寄存器?
8 N' \) F5 f! N# m8 ltf_putp() or tf_strdelputp().8 L3 f0 i5 z+ |3 O; Q

) ~( J& d" j- F/ U; xF.4 什么库函数可以读取存储单元的值?0 s) @& X/ ^$ Q& r9 \4 m' K  X
tf_nodeinfo().
. A7 b6 L" w- M* `& ~$ W. x6 i3 M4 p, }4 b8 w
F.5 Is there an access routine to manipulate memory variables in Verilog PLI ? 4 p4 ^, d* d" U/ M
Not in the standard Verilog. VCS is working on providing one in version5.1: m, X0 e/ u& c. u+ ]7 X

) B) [9 a2 _( ], f4 s. NF.6 How do I change delay value of an object ?
1 u  @6 T2 }  X" P- I) ZIf you want to add a value to an already existing delay value, use acc_fetch_delay(). If you want to replace the current delay value with a new one, use acc_replace_delays().
, q8 v% ~/ [* e6 G) a7 {& v
+ H) O! I  G, p$ v9 N& `7 }F.7 How do I implement a callback ?
. u' ^. f( G" a/ `" h+ X* |There are different kinds of callbacks and depending on what kind you want to implement as well as what version of PLI you are using, you need to use different library functions. For example, in PLI1.0 you need to use the function tf_setdelay() for introducing a callback event after certain simulation time, tf_asynchon() to invoke a function asynchronously whenever any parameter value changes.
- j; D8 F8 g/ n3 {# d6 S% U! O/ y' g$ z! Y4 F4 K4 B
F.8 Is there a PLI library function to tell me the value of a macro (defined using `define) ? 0 v; _0 w' Z. r& H! t" h: l& h
No. Macros are preprocessed and substituted before the actual compilation takes place. So it is not possible for a PLI routine to find out the value.
6 D$ R, u$ M3 A8 c2 qA trick to avoid this problem is to define the macro as an environment variable before running the simulation, then inside your PLI routine use the standard C library function getenv() to access the value of that environment variable. If you intend to change/undefine the macro, use another PLI routine which calls putenv() to set a new value of the variable.
( P4 e: D$ x& p8 D9 H: U
: y) K8 f" }( \7 H: t; EF.9  PLI C/C++程序能否调用verilog任务和函数? : E  R5 [3 n- w8 A) \
A C/C++ function in a PLI application can not invoke a Verilog task or function directly. But, here is a work-around for that. 9 v0 R' R4 T: D8 k, A* q- U, U
1.声明一个 reg: 0 c. h: b8 x4 T& T
引用:
& D. e1 @% V* T- \
  reg flag;" K. T3 B$ j8 ^( z
  initial flag = 1'b0;. S: C' J4 r! w( E1 C3 E
/ ~/ `; N4 g: n4 I7 y2. 把这个reg和其他自变量一起传递给系统调用:
  u1 H) }8 Q* X) ?" {4 P5 c
引用:
) k) X( E+ f  C1 {     ...
$ `+ e9 k, S, D5 d' ?! {5 C4 J; u     $my_call(flag, ...);
; H6 n; o! [/ v; J4 B
! r& g" t' e) s# I( H
3. 在PLI程序内改变这个reg值,在你想调用Verilog任务和函数的时候。1 N' k( D4 X7 K0 D4 l3 Z
引用:
   . m3 L% t* p7 A8 Z; _' O
  tf_putp(1, 1-tf_getp(1));9 T3 ~) I: ~% J
+ Q  L+ I' h4 R2 X
4. 回到verilog语言, 加上这个
) [9 [6 o5 d1 @. \4 x( J% \: G3 T
引用:
, ?+ O; M7 M4 S  always @(flag)
3 v& N$ G: r1 K     call_my_task(...);
* A& C' P4 D; e" G$ H' V2 X  O
% L# Y! s& N: s0 @当flag改变这个值时,这将调用verilog任务 call_my_task()。
  z6 W" [3 [$ x1 _: Q: Q3 Z0 g! q  p) J; ^2 I4 Y$ \5 ?6 D7 U$ O

$ X1 Z- X3 i( [, _5 |; B9 d( G) w" ]
1. 若出现类似于以下错误代码,怎么办?9 L' g$ \) q) e. K5 Y3 A
  ncsim: *internal* (sv_seghandler - trapno -1)./ N4 G5 X) P) g* E
  Observed simulation time : 18525 NS + 01 Z1 Q, M7 y7 K4 O/ C
  Please contact Cadence Design Systems about this problem
* t: ?7 z) A- L, g2 L5 z9 U* T; J( T       and provide enough information to help us reproduce it.. V6 z& E7 Q" a$ d% M8 p5 Y
***Current stack trace:
) h3 V# e1 T  k$ R, ]0 w-->[User Code       ] 0xb6b316ec input_mon            + 60       ../pli/mon/input_mon.so
7 a+ v) h5 o+ m; }5 J, u! @1 Q4 i-->[TF CB Support   ] 0x811531f <don't know>
( {* T( b0 e. g-->[VPI Overhead    ] 0x8148cca <don't know>
8 p( @8 g8 M! e+ d0 D& O" @& z***Verilog source where error occurs:
" E6 Q8 R, B6 S' J& t6 \1 n' T  $input_mon(...) (PLI calltf)
/ a, K# d' E2 f       Module: input_mon
. |3 R9 ?9 v. I* Q/ {  _       Instance: tb.input_mon
( F* c" ^) K9 H/ @5 C* g       File: ../pli/mon/input_mon.v
4 V% V" y, f2 V2 Q0 d% {& `       Line: 28
6 W$ g; M  \4 E9 e. Q8 c$ tncverilog: *E,SIMERR: Error during Simulation (status 1), exiting.2 ~# o' T/ D/ F1 R

% G5 N1 x' H) h( A答: 应该是C代码有问题。检查C代码。
With your idea, Carry out together.

TOP

PLI only seems to work with waveform dumping enabled
9 s6 ^4 T  {: m9 U7 b# M. g! }8 s( c
Question:
% k: W7 ~; W+ l' ^2 I9 p( B- W
1 e( U/ \4 D& i  ?; n- j3 _: vIn trying to run my simulation with a PLI that I created, it only/ O$ L7 a5 r4 m0 d" ]' }1 f
seems to work when I have VCD+ enabled (via -I, -PP, or -RI).  If I
& G1 {! y* l, i$ ]' gremove the VCD+ enabling switches, then I get a Segmentation Fault
: t7 G6 p2 B- A& m8 N% C' Cwhen I run the "simv."  Why does my simulation only work with VCD+) Y6 q2 G" k$ O( }4 z- y( H
enabled?8 |8 E+ N8 }6 O$ i: E8 O
9 F  k& M( |) S4 E' @6 I
Answer:
- d4 N; A' s: [/ B' F# H  @6 w8 [$ J) @
When using PLI with a simulation, you need a dispatch table to map the
. m" S- w1 R+ EPLI call in the Verilog to the function in the C or C++ program.  You tell" r+ h8 l% i( ]- T
VCS about this dispatch table with the -P switch.  For example:
' U) R3 f6 x! K& |! N
" O) u! o, K# |  v$ X% vcs -P my_pli_dispatch.tab top.v my_pli_source.c
0 W, w+ Z. x: C% V' a' q8 ^6 @. N1 G8 a4 ?
If your .tab file does not have visibility enabled for everything that
3 P. s; t( a, }the PLI functions touch in your design, then the simulation will fail9 U, a# D8 n! \9 S- F  {
during runtime.  Enabling waveform dumping will mask this.  For* [0 I* O: y, g& v: q" I/ f$ T
example, if you switch to the following command line, the simulation5 |9 s+ R" ]/ i* o
will run fine:
2 X+ ]0 {6 b6 u+ S; Z
5 j3 u5 W, l3 D+ |% vcs -PP -P my_pli_dispatch.tab top.v my_pli_source.c* P  m* y$ I9 U1 h: y; s
  q8 m; L( N. K2 c7 o+ P7 }
Enabling dumping turns on visibility for the entire design, masking
" [, v7 s* ~# |the fact that the .tab file has deficiencies.  However, full( e/ Z$ R8 R' N: l# D
visibility also degrades performance.
. l0 n, B' q* E2 [& ^5 P1 ]$ j( r) A5 E4 U% l" A
Please see the "Using the PLI" chapter of the VCS/VCSi User Guide & H$ a/ a  a, O1 _4 w  y6 i
($VCS_HOME/doc/UserGuide/vcs.pdf) for information on how to enable3 d3 T  ]& K' o( \% y9 w# b
the visibility you need with the dispatch table.  Creating a .tab file
) m1 x  t# T' K$ Y6 d: y+ Bwith the correct visibility enabled will allow you to turn off
9 c2 w9 z) Z( Nwaveform dumping and run faster.' I( v1 q# I; v4 h8 o. H# h! ?

4 n( S  Z# e: M& p9 ]Better yet, you can also try VCS' feature for adaptive PLI.  Adaptive
/ N$ Z3 d5 W7 g) j# gPLI will create an optimized .tab file for you.  See the "Using Only
* R, W" ]+ M9 gThe ACC Capabilities That You Need" Section of the VCS/VCSi User Guide 5 q) {% O2 @, B& r7 o* M. A8 i1 E; k
for instructions on how to use adaptive PLI.
! Y! f8 `+ Y# w3 R* ~/ y
5 m+ p+ x' U0 g$ }, s" i/ ]And lastly, for even faster performance, use VCS' DirectC/ P/ ]$ d) l( [5 @9 q
functionality to bypass the PLI altogether creating a direct interface
/ I- s" a! M0 I4 x1 f* @between your C/C++ functions and VCS.  To learn more about using Direct C
6 I7 {" Y+ m0 n. x6 B% Xwith VCS, refer to the VCS DirectC Interface User Guide, [: \) ~( q  q8 d# b) }' F$ |: r; g" w
($VCS_HOME/doc/UserGuide/directc.pdf).
With your idea, Carry out together.

TOP

我写的 “tf_putp(3,  d1);”" R+ h0 ~0 R8 r! D" Q  a& s
而在testbench里发现这个对应的d1的值始终为x,是为什么阿??

TOP

请问楼主:

在verilog环境里,调用 x=$pli();- y0 s  l( V5 c; b
在pli里我想使用 tf_putf(0,a);给x传值
$ [7 i6 E$ b8 g, n: n请问:用vcs时链接时,该怎么写.tab文件啊??
9 z9 W7 K7 F- s$ C谢谢!!

TOP

发新话题