纯技术笔记,如需讨论,请留言。 如果您对我的笔记有什么建议,请留言。 由于博客图床大小的限制,所以有些博客只能link到#blog.csdn.net/fanyongwinner

UVM TLM详解

上一篇 / 下一篇  2016-09-08 11:47:30 / 个人分类:UVM notebook

TLM中的三种端口

PORT

uvm_*_port #(T)

8K Q+@e#{6V0  *可以由下面任意一个代替:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台-hE8c,IUfX4zV0N$R)E

  • blocking_put
  • nonblocking_put
  •  put
  • blocking_get
  • nonblocking_get
  •  get
  • blocking_peek
  • nonblocking_peek
  • peek
  •  blocking_get_peek
  • nonblocking_get_peek
  • get_peek

/G6Q9N!D*B-V%g0    T:The type of transaction to be communicated by the export龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Pq3OD(ON^:w

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台{ cp}"S4V"U5h9f` y

    Ports are connected to interface implementations directly via uvm_*_imp #(T,IMP) ports or indirectly via hierarchical connections to uvm_*_port #(T) and uvm_*_export #(T) ports.龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 K8i1U6z q?x

6S'l-jq8ftp0

uvm_*_port #(REQ,RSP)

2R }(RD#NoU0    *可以由下面任意一个代替:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台-a_B,e_.Bqo

  • blocking_transport
  • nonblocking_transport
  • transport
  • blocking_master
  • nonblocking_master
  • master
  • blocking_slave
  • nonblocking_slave
  • slave
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台!a4L9n(|3G

    REQ:  The type of request transaction to be communicated by the export龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台p7O3oFn;x*D:j

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$t2W9oc/}F6{

    RSP: The type of response transaction to be communicated by the export龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台`c*lz/l1H2S8H4a"S

c#G _/W8[_4DeQ.N r4P0   Ports are connected to interface implementations directly via uvm_*_imp#(REQ,RSP,IMP,REQ_IMP,RSP_IMP) ports or indirectly via hierarchical connections to龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 r)ku7|.d:AT
   uvm_*_port #(REQ,RSP) and uvm_*_export #(REQ,RSP) ports龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 [u8o?%xcS-M

EXPORT

8I.Kk3Ghy+oh0与PORT类型相似,同样有与port对应的uvm_*_export #(T)和uvm_*_eport #(REQ,RSP)龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 ON8\Q0F zq3fw

IMP

s8k)W:];[(W0与PORT类型相似,同样有与port对应的uvm_*_imp #(T, IMP)和uvm_*_imp #(REQ,RSP,IMP,REQ_IMP,RSP_IMP)

]$|%c&QR0

(o7hB @:HgW0T: The type of transaction to be communicated by the imp龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台O@ l5c(_R(~ M

H*^n2Q[-H,a0IMP:The type of the component implementing the interface. That is, the class to which this imp will delegate

(]0l v B,Q0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 dn%C Vt*H~^8T

REQ:Request transaction type

!g8N1e4QB_ E/Pn0

#aB5@gRv&VN0RSP Response transaction type龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台R5Qa0M8l)W_!v

JcT6] L*h7S3f7r0REQ_IMP Component type that implements the request side of the interface.Defaults to IMP. For master and slave imps only.

5rwv]3LX0

J$Y xrWEg0RSP_IMP Component type that implements the response side of theinterface. Defaults to IMP. For master and slave imps only.

2oj5nI*td0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台6lO.{r'N0X!d_:r

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台f9R8?Q;RnT_
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台1k4Cw-T?!M0]R5nS G

TLM的通信

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0[FJf @

首先是connect,只能有下面几种connection type:

6GfV3} Rf)c0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台*ud'x$_(F7gj8c


\p6j!h!~/~e\j0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#YG$p Cq!}V+C8[

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台/RhD;^}$u-gR

其次要理解控制流和数据流的方向。

d0K8A l|qE'[0Q`7B)^d0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台p;M{'P.Rr

控制流: 控制流永远是port到export或imp port的。也就是说,永远去是port作为数据通信的发起者去call put/get等function龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台x~@!b9Q

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0U#},X1s4R!qx ^!tu-}

数据流:数据流有可能是从port到export/imp port,也有可能从export/imp port到port.

I,E`Qn`1\{0

N!S#G9\,k9Eb"_y/C0怎么理解呢,如下对比:

#ld*h*Kh!M0

s9W6D1S6qIQX*Lb!V h0component A有uvm_put_port,component B有uvm_put_export,当A call put  task时,数据从A传递到B龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#B$w:h3r e

fG*D!m9riK1gI0component A有uvm_get_port,component B有uvm_get_export,当A call get task时,数据从B传递到A

N5geP[5c.m%a\)i0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台B)~mB}]

而不管是put还是get task,都会在component B中进行定义。有点像是A去调了B的task。所以总结起来就是port的task/function都要落到B的task/function上去实现龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台6|1I]iP&DR'^

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台;o7e/sya

最后一定注意两件事情:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台tN:Q-}(h"W9@)rNYrC

$bl{ R1O#?tws{)U0connect两边的tlm port的type以及transaction type一定要一致,比如blocking_put_port要连接 blocking_put_export或put_export龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台/Q3_eaaeh']9H

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台/b5b&x%s.@2QY

更需要注意,一定要使用IMP 来终结连接关系, PORT和EXPORT都不能做为连接关系 的终点。

4X;y1N:UC8uL3Q0

analysis port,analysis export, analysis imp
"f g6trG/~F+h9\0

0N U*l o"Z0其实实际运用上,还是最常用analysis  port/imp/export(它们有点像是port/export/imp的增强版,就个人经验来讲完全已经足够了)。主要有以下区别:

|+\lvqZ$P:{6MAt?0
  • 一个analysis port可以连接多个analysis export/imp, 也就是说analysis port更像一个广播。
  • analysis port只有一个write function。
  • analysis port没有阻塞非阻塞的区分,它本身只是广播,不必等待其它相连的port的响应。

0r P'M+^&V!}3F0既然是广播,那么就有可能一个analysis port连接到两个以上的imp,但是write function只有一个,我们怎么办呢?龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台m!?@8l)J Jd)@

b1Hh)JR?.L q]+k&j0处理方案:

_[ uE$q0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.h}k9k&B O.^G*A3y#kH

1.通过宏uvm_analysis_imp_decl声明两个后缀不一样的imp,UVM会根据两个后缀内建两个新的imp
q#L!F'qe*X$HQ0

(D-_@'I5W0rK O0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台m*m'n3D:y PU{

`uvm_analysis_imp_decl(_export1)龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台_s?] K JZ&p*w6R$S+a_

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 XcK L#[f*fd

`uvm_analysis_imp_decl(_export2)

C!J4K!lXiNQ0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台1WB]/KD,]h

2.声明 port龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台T @ |+[y8y/R*v'Z eQ

XE9k:kh4KMO0uvm_analysis_imp_export1 #(transaction, scoreboard)     scb_imp1;

t h t0B ^ ? [o0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(Fh(VO.G Ny

uvm_analysis_imp_export2#(transaction, scoreboard)      scb_imp2;龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台*P$R;X/W+p0B

&v4Z&vx7^ h/Jlx03.分别定义两个port的write function

(m!ZUd2AC-\S+e0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'Z*AKZ7[1j

function void write_export1(transaction txn);龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台v}*n7?"`z

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台H7E7YT!C*]5p{

function void write_export1(transaction txn);龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台!wwmz1d7B G1MJ

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,R"K+@{zu

特别要注意的一点:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台2xp [P+j Y$r0mYou

#?C'IR{H0analysis port广播出去的是handle,并没有为每一个export/imp的transaction分配alloction,如果如果 export1如果对transaction进行了修改, 那么export2会看到修改后的transaction.所以好的习惯是在write function里面首先 new一个 transaction,并对传输过来的transaction进行copy后,再进行后面的操作。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台9^}T6uK{

's{A${l-d Xo`0

uvm_tlm_fifo,uvm_tlm_analysis_fifo

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#J$F/B Nxc3ox

顾名思义,uvm_tlm_fifo其实就是能够在tlm肚子里面buffer很多transaction,就像FIFO一样。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台6TDw Q$w6i8d+v^\L

DN` ~ i:`0v0有人可能会这样做,我自己在scoreboard里面申明queue,也一样做到fifo的效果。确实,很多情况下,直接把analysis port传过来的transaction放queueu里面,是一个不错的方法。但fifo还有以下几个好处:
R NK E2eY;~-|0

W*^4cG4E1Gl&WC%T;b0

6w AF*ca01. uvm_tlm_fifo是被动接收数据和被动发送数据,因此可以把发起端和接收端完全分隔开,发数据和收数据的行为完全独立。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台c,Y ^L G0n

@*j x'e&B };E%HP02.如果design的transaction有 outstanding,那么uvm_tlm_fifo就直接可以model design的fifo行为了(当然用queue做也不错,甚至碰到out of order的时候比fifo还好用)。

`E Eo(b0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台+W(St.G])`'@

3.通过imp加后缀可以解决多对port,export的情况,但如果port数据多了呢。比如一个有16进16出的AXI interconnect,在scoreboard的port上去申明16个不同名字的imp显然不方便。那么这时候只需要申明一个 uvm_tlm_fifo数组就可以了。(IMP没办法申明数组)

b8l`+kL1]0

,\1{{6b q)J`2z(Zp0example:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台&Di LBO%t I!}

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(pL(o"rE \

scoreboard:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台_%ltvq2C

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0X`_/U0G

 uvm_tlm_analysis_export (#sb_item)     in_expor[10];

sEBF7H0c&@3\k0

~ pBgP0 uvm_tlm_analysis_fifo(#sb_item)            scb_fifo[10];龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台@,g{i6P/zf

9l @(yE;l-\0 uvm_blocking_get_port #(sb_item)          fecth_port[10];
Xz"VPK/v0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 MP#}#^'i

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台"o7c$w5k3NqV

  ...龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0v ?`:Ou9TJ

U)z9c;YIZ[,_e(e0  function void connect_phase

c7kQ c G)W3sQ~0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台+^a1{5r)k lI

    foreach(in_export[i]) begin龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:}1q-V!kd,qP

-w%`wJ6b,x's%t0

U!W&k"zw0      ip_export[i].connect(sb_fifo[i].analysis_export);  
-ayw4W W_0

f/e7U%ksi-Ak0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8Gx,\"b&cf$p5b

      fetch_port[i].connect(sb_fifo[i].blocking_get_export);龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 b'h |A @3^w c
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台KQ9PG \8D

O$Q)TT^+lYd4~0    end龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8V{3B8u6|'g1LC?

Iv_!m5f:M"f|0^6K M0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:f_:u)C i3d{X

  endfunction龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 `(g5@0w q j~.Q

lo Q!A*^"H0K8n"i0龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台d"H?L ^4?4V7r
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台?|(jE5C]ptt7Z

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台*^^#^[%D.IgEq

env:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,B`5b:E5Cl0Zl.@-G

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台c'o:cNj^\ F

  function void connect_phase

)cfpx&H-If;~8y0

_{$nvpHj0   foreach(mon[i])

V2@'z ~6ag0

waZ;P J\6U0    mon[i].op.connect(scb.in_expor[i]);// 为什么要有一个in_export作桥梁,而不直接用mon.op连到scb的fifo呢。可以参考uvm_users_guide 2.3.2,这里不作详细说明
Ho t9[5FK/R0

_] PJMD-Sl0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台{kr-vhf

  endfunction龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台vnO?4lP5Y Q&I(TE
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台-}gga~2e

 在soreboard中,不必再去写一个write function和get task了,因为fifo里面已经做了。mon.ap.write直接把数据放到fifo里面,而fetch_port.get直接出fifo头 拿数据。

TAG: TLM

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar