uvm的scoreboard中存储参考值和实际值的变量是什么类型
时间: 2025-04-01 21:01:31 浏览: 37
<think>嗯,我现在要了解一下UVM中的scoreboard里面用来存储参考值和实际值的变量类型。首先,我需要回忆一下UVM的基础知识。UVM的scoreboard主要用于验证DUT(被测设备)的输出是否符合预期,所以它需要比较实际输出和预期的参考值。那这两个值在代码里是怎么存储的呢?
记得在UVM中,通常使用TLM(事务级建模)来传输数据,所以scoreboard可能会通过analysis port接收来自monitor的数据。那存储这些数据的话,可能用的是队列或者动态数组之类的结构?比如,当DUT的输出事务被monitor捕捉到后,会被送到scoreboard里,这时候需要保存起来,等待和参考模型生成的期望值做比较。
参考模型生成参考值,可能有不同的方式,比如通过算法计算,或者从输入事务转换而来。而scoreboard需要将这两种值进行比较,所以存储它们的变量类型应该能够支持这种比较操作。比如,使用关联数组(associative array)来按某种键值存储,或者用队列(queue)按照顺序存储,然后按顺序比较?
对了,UVM中常用的数据结构有uvm_tlm_analysis_fifo,这个可能用来临时存储事务对象,但用户自己定义的存储结构可能更灵活。比如,使用动态数组(dynamic array)或者关联数组来保存实际值和参考值。比如,用int类型的数组,或者直接存储事务对象的句柄(handle)?
比如,假设DUT处理的是数据包,每个数据包有唯一的ID,那么scoreboard可能会用一个以ID为键的关联数组来保存参考值和实际值。这样当实际数据到达时,可以通过ID找到对应的参考值进行比较。
不过,具体到变量类型,可能取决于存储的内容是什么。如果事务是自定义的uvm_object,那么变量类型应该是该对象的句柄。例如:
uvm_tlm_analysis_fifo #(my_transaction) actual_fifo;
my_transaction ref_values[$];
或者,可能使用关联数组:
my_transaction ref_values[bit [31:0]]; // 以某个ID为键
而实际值可能同样存储在类似的队列或关联数组中。或者,可能使用队列来按顺序存储,前提是事务的顺序是可预测的。
另外,也有可能是使用uvm_in_order_comparator这样的组件,它内部可能已经管理了两个队列,一个用于期望值,一个用于实际值,然后自动比较。这时候变量类型可能是comparator内部的队列,用户不需要自己管理。
但如果是自己实现scoreboard的话,用户可能需要定义两个队列或者数组,比如:
my_transaction expected_queue[$];
my_transaction actual_queue[$];
然后在接收到事务时,分别push到对应的队列中,然后逐个比较。
或者,如果事务有唯一标识符,可以用关联数组:
my_transaction expected_data[int];
my_transaction actual_data[int];
这样,当收到一个实际事务时,根据它的ID取出对应的期望值进行比较,然后删除条目。
总结来说,存储参考值和实际值的变量类型通常是用户自定义的事务类型的动态数组(dynamic array)、队列(queue)或者关联数组(associative array)。具体选择哪种数据结构取决于比较策略,比如是否按顺序比较,或者根据事务的某个键值来匹配。
但需要确认在UVM中常见的做法。比如,在UVM的示例中,scoreboard可能会使用两个uvm_tlm_analysis_fifo来分别存储期望和实际的事务,然后从中取出进行比较。这种情况下,变量类型是uvm_tlm_analysis_fifo的实例,但这些fifo内部维护的是队列结构。或者,用户自己维护队列,比如用队列来保存从analysis port接收的数据。
可能还需要考虑线程安全的问题,比如使用mailbox来传递事务,但通常scoreboard通过analysis port的write方法接收数据,然后将其存入队列或数组。这时候变量类型可能是队列或者关联数组,元素类型是事务对象的句柄。
所以最终结论应该是,存储参考值和实际值的变量通常是用户定义的事务类型的队列或关联数组,例如my_transaction类型的队列或关联数组,具体类型根据比较策略而定。</think>在UVM中,Scoreboard用于比较**参考值**(由参考模型生成)和**实际值**(从DUT输出捕获)。存储这些值的变量类型需根据比较策略和事务特性灵活选择。以下是具体实现方式:
---
### **1. 变量类型选择依据**
- **按顺序比较**:若事务顺序固定且无需唯一标识,可使用**队列(Queue)**。
- **按唯一标识匹配**:若事务有唯一ID或键值,使用**关联数组(Associative Array)**。
- **事务对象存储**:通常存储事务的**句柄(Handle)**而非原始数据,避免复制开销。
---
### **2. 常见实现方式**
#### **(1) 使用队列(Queue)**
- **适用场景**:事务顺序严格匹配(如流水线处理)。
- **变量定义**:
```systemverilog
// 定义事务类型(如自定义的uvm_object)
my_transaction expected_queue[$]; // 存储参考值
my_transaction actual_queue[$]; // 存储实际值
```
- **操作流程**:
1. 通过`analysis_port`接收参考模型和Monitor的事务。
2. 将参考值`push_back`到`expected_queue`,实际值`push_back`到`actual_queue`。
3. 按顺序从队列头部取出事务,逐条比较。
#### **(2) 使用关联数组(Associative Array)**
- **适用场景**:事务有唯一标识符(如ID、地址)。
- **变量定义**:
```systemverilog
// 以ID为键值存储事务句柄
my_transaction expected_data[int]; // 参考值(键为ID)
my_transaction actual_data[int]; // 实际值(键为ID)
```
- **操作流程**:
1. 根据事务ID,将参考值存入`expected_data[ID]`。
2. 当实际事务到达时,通过`ID`索引取出对应参考值。
3. 比较后删除已匹配的条目。
#### **(3) 使用UVM内置组件(如`uvm_in_order_comparator`)**
- **适用场景**:简化顺序比较逻辑。
- **变量类型**:由`comparator`内部管理两个队列,用户无需显式定义。
```systemverilog
uvm_in_order_comparator #(my_transaction) comparator;
```
- **操作流程**:
1. 将参考值和实际值分别写入`comparator.expected_export`和`comparator.actual_export`。
2. `comparator`自动比较并报告结果。
---
### **3. 代码示例(自定义Scoreboard)**
```systemverilog
class my_scoreboard extends uvm_scoreboard;
// 定义关联数组存储参考值和实际值
my_transaction ref_values[int]; // 参考值(键为事务ID)
my_transaction act_values[int]; // 实际值(键为事务ID)
// Analysis Port声明
uvm_analysis_imp #(my_transaction, my_scoreboard) ref_port;
uvm_analysis_imp #(my_transaction, my_scoreboard) act_port;
// 比较方法
function void compare(int id);
if (!ref_values.exists(id) || !act_values.exists(id)) begin
`uvm_error("SCBD", $sformatf("Transaction ID=%0d mismatch", id))
end else if (!ref_values[id].compare(act_values[id])) begin
`uvm_error("SCBD", $sformatf("Data mismatch for ID=%0d", id))
end else begin
`uvm_info("SCBD", $sformatf("ID=%0d matched", id), UVM_LOW)
end
ref_values.delete(id);
act_values.delete(id);
endfunction
endclass
```
---
### **4. 关键注意事项**
- **线程安全**:若参考值和实际值来自不同线程,需使用`mailbox`或`semaphore`同步。
- **内存管理**:及时释放已比较的事务句柄,避免内存泄漏。
- **调试支持**:在比较失败时输出详细日志(如事务ID、字段值)。
通过合理选择变量类型和数据结构,Scoreboard能高效完成数据比对,确保验证可靠性。
阅读全文
相关推荐

















