如果在构建更加复杂的协议总线传输,例如PCie、USB3.0等,那么通过一个单一的传输层次会对以后的激励复用、上层控制不那么友好。对于这钟更深层次化的数据传输,在实际中无论是VIP还是自开发的环境,都倾向于通过若干抽象层次的sequence群落来模拟协议层次。通过层次化的sequence可以分别构建transaction layer、transport layer和physical layer等从高抽象级到低抽象级的transaction转化。这种层次化的sequence构建方式,称之为layering sequence。例如在进行寄存器级别的访问操作,其需要通过transport layer转化,最终映射为具体的总线传输。

typedef enum {
CLKON, CLKOFF, RESET, WRREG, RDREG} phy_cmd_t; // 定义物理层命令枚举类型
typedef enum {
FREQ_LOW_TRANS, FREQ_MED_TRANS, FREQ_HIGH_TRANS} layer_cmd_t; // 定义数据层命令枚举类型
class bus_trans extends uvm_sequence_item; // 定义物理层事务类
rand phy_cmd_t cmd; // 随机物理层命令
rand int addr; // 随机地址
rand int data; // 随机数据
constraint cstr {
// 定义约束
soft addr == 'h0; // 限制地址为 0
soft data == 'h0; // 限制数据为 0
}
...
endclass
class packet_seq extends uvm_sequence; // 定义数据层序列类
rand int len; // 随机包长度
rand int addr; // 随机地址
rand int data[]; // 随机数据数组
rand phy_cmd_t cmd; // 随机物理层命令
constraint cstr {
// 定义约束
soft len inside {
[30:50]}; // 包长度范围为 30 到 50
soft addr[31:16] == 'hFF00; // 地址的高 16 位固定为 'hFF00
data.size() == len; // 数据数组大小等于包长度
}
...
task body(); // 序列执行逻辑
bus_trans req

最低0.47元/天 解锁文章
1653

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



