我们现在就UVM TLM FIFO 类来拆解uvm_tlm_fifo 的相关方法和功能,代码中包含了uvm_tlm_fifo 和 uvm_tlm_analysis_fifo。它们用于在 UVM 验证环境中不同组件之间传输事务。让我们分别分析其功能:
- uvm_tlm_fifo 类:
功能: 这是一个通用的 TLM FIFO,用于在两个进程之间缓存事务。它具有有限的容量(可以通过 size 参数指定,默认为 1),并按照先进先出 (FIFO) 的原则处理事务。
关键方法:
new(): 构造函数,初始化 FIFO 的大小。如果 size 为 0,则 FIFO 容量无限大。
put(): 将事务放入 FIFO。如果 FIFO 已满,则阻塞直到有空间。
get(): 从 FIFO 获取事务。如果 FIFO 为空,则阻塞直到有事务可用。
peek(): 查看 FIFO 中下一个事务,但不将其移除。
try_put(), try_get(), try_peek(): 非阻塞版本的 put, get, peek 方法。如果操作成功则返回 1,否则返回 0.
size(): 返回 FIFO 的容量。
used(): 返回 FIFO 中已使用空间的大小。
is_empty(): 检查 FIFO 是否为空。
is_full(): 检查 FIFO 是否已满。
can_put(): 检查是否可以放入事务。
can_get(): 检查是否可以获取事务。
can_peek(): 检查是否可以查看事务。
flush(): 清空 FIFO。
内部机制: 使用 mailbox #(T) 作为底层存储机制。mailbox 是 UVM 提供的用于进程间通信的组件,它提供了线程安全的读写操作。
- uvm_tlm_analysis_fifo 类:
功能: 这是一个基于分析接口的 FIFO,其容量无限大。它主要用于连接分析端口 (uvm_analysis_port) 和 TLM 目标组件。这种 FIFO 能够在不阻塞的情况下写入事务,因为它的容量是无限的。
关键方法:
new(): 构造函数,初始化一个无限容量的 FIFO,并创建一个 analysis_export 接口。
write(): 将事务写入 FIFO。由于容量无限大,此操作总是成功的。
与 uvm_tlm_fifo 的区别:
容量:uvm_tlm_analysis_fifo 容量无限大,而 uvm_tlm_fifo 容量有限。
接口:uvm_tlm_analysis_fifo 提供了 analysis_export 接口,用于连接分析端口。
阻塞:uvm_tlm_analysis_fifo 的 write 操作是非阻塞的,而 uvm_tlm_fifo 的 put 操作可能是阻塞的。
typedef class uvm_tlm_event; // 定义一个 uvm_tlm_event 类类型的别名
//------------------------------------------------------------------------------
// 标题:TLM FIFO 类
//
// 本节定义基于 TLM 的 FIFO 类。
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// 类:uvm_tlm_fifo
//
// 此类在两个独立运行的进程之间提供事务的存储。事务通过 ~put_export~ 放入 FIFO。
// 事务按到达的顺序从 FIFO 中获取,通过 ~get_peek_export~ 获取。~put_export~ 和
// ~get_peek_export~ 继承自 <uvm_tlm_fifo_base #(T)> 超类,这些导出提供的接口方法由
// <uvm_tlm_if_base #(T1,T2)> 类定义。
//------------------------------------------------------------------------------
class uvm_tlm_fifo #(type T=int) extends uvm_tlm_fifo_base #(T); // 定义一个名为 uvm_tlm_fifo 的类,参数化类型为 T (默认是 int),继承自 uvm_tlm_fifo_base #(T)
const static string type_name = "uvm_tlm_fifo #(T)"; // 定义类的类型名称
local mailbox #( T ) m; // 定义一个局部邮箱,用于存储事务,类型为 T
local int m_size; // 定义FIFO的大小
protected int m_pending_blocked_gets; // 保护型变量,跟踪阻塞的get操作数量
// 函数:new
//
// ~name~ 和 ~parent~ 是标准的 uvm_component 构造函数参数。如果 <uvm_tlm_fifo> 将
// 用于静态详细阐述的结构(例如,模块),则 ~parent~ 应为 null。~size~ 指示 FIFO 的
// 最大大小;值为零表示没有上限。
function new(string name, uvm_component parent = null, int size = 1); // 构造函数
super

最低0.47元/天 解锁文章
812

被折叠的 条评论
为什么被折叠?



