使用UVM框架编写不成帧、成帧、成复帧三种工作模式下生成E1帧的sequence
时间: 2023-11-27 08:04:00 浏览: 141
通信与网络中的E1成/解帧器的设计
5星 · 资源好评率100%
以下是使用UVM框架编写不成帧、成帧、成复帧三种工作模式下生成E1帧的sequence的示例代码:
```
class E1_frame_sequence extends uvm_sequence #(E1_frame);
`uvm_object_utils(E1_frame_sequence)
function new(string name = "E1_frame_sequence");
super.new(name);
endfunction
virtual task body();
// 不成帧模式下的E1帧生成
E1_frame e1_frame1 = new();
e1_frame1.set_mode("Unframed");
e1_frame1.set_sync(32'hFFFFFFFF);
e1_frame1.set_data(random_data(32));
e1_frame1.set_checksum(get_checksum(e1_frame1));
`uvm_info(get_type_name(), $sformatf("Generated E1 frame in Unframed mode with data %0h", e1_frame1.get_data()), UVM_MEDIUM)
// 成帧模式下的E1帧生成
E1_frame e1_frame2 = new();
e1_frame2.set_mode("Framed");
e1_frame2.set_sync(64'h2F2F2F2F2F2F2F2F);
e1_frame2.set_data(random_data(32));
e1_frame2.set_checksum(get_checksum(e1_frame2));
`uvm_info(get_type_name(), $sformatf("Generated E1 frame in Framed mode with data %0h", e1_frame2.get_data()), UVM_MEDIUM)
// 成复帧模式下的E1帧生成
E1_frame e1_frame3 = new();
e1_frame3.set_mode("Multiframe");
e1_frame3.set_sync(128'h2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F);
e1_frame3.set_data(random_data(192));
e1_frame3.set_checksum(get_checksum(e1_frame3));
`uvm_info(get_type_name(), $sformatf("Generated E1 frame in Multiframe mode with data %0h", e1_frame3.get_data()), UVM_MEDIUM)
// 将生成的E1帧分别发往DUT
seq_item_port.write(e1_frame1);
seq_item_port.write(e1_frame2);
seq_item_port.write(e1_frame3);
endtask
function logic [31:0] random_data(int size);
logic [31:0] data;
repeat(size/4) begin
data[$*4 +: 4] = $random;
end
return data;
endfunction
function logic get_checksum(E1_frame e1_frame);
logic [31:0] data = e1_frame.get_sync() >> 32;
data = {data, e1_frame.get_sync() & 32'hFFFFFFFF};
data = {data, e1_frame.get_data()};
logic [7:0] checksum = ~data.sum();
return checksum;
endfunction
endclass
```
以上示例代码中,使用了一个名为E1_frame的class表示E1帧数据,其中包含了mode、sync、data和checksum四个field。在sequence的body中,分别构造了不成帧、成帧、成复帧三种工作模式下的E1帧数据,并将其通过seq_item_port发往DUT。其中,get_checksum函数实现了校验码的计算方法,sum()函数用于计算data的总和。
阅读全文