代码拉取完成,页面将自动刷新
`ifndef MY_DRIVER_SV
`define MY_DRIVER_SV
class my_driver extends uvm_driver#(my_transation);
`uvm_component_utils(my_driver);
virtual my_if vif;
function new(string name="my_driver", uvm_component parent=null);
super.new(name, parent);
`uvm_info("my_driver", "new is called", UVM_LOW);
endfunction : new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
`uvm_info("my_driver", "build_phase is called", UVM_LOW);
if (!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif)) begin
`uvm_fatal("my_driver", "interface set error!");
end
endfunction: build_phase
/* task main_phase(uvm_phase phase); */
/* /1* my_transation tr; *1/ */
/* phase.raise_objection(this); */
/* `uvm_info("my_driver", "main_phase is called!", UVM_LOW); */
/* vif.data<=8'b0; */
/* vif.valid<=1'b0; */
/* while(!vif.rst_n) begin */
/* @(posedge vif.clk); */
/* end */
/* /1* for (int i = 0; i < 256; i++) begin *1/ */
/* /1* @(posedge vif.clk); *1/ */
/* /1* vif.data<=$urandom_range(0,255); *1/ */
/* /1* vif.valid<=1'b1; *1/ */
/* /1* `uvm_info("my_driver", "data is drived!", UVM_LOW); *1/ */
/* /1* end *1/ */
/* for (int i = 0; i < 2; i++) begin */
/* /1* tr=new("tr"); *1/ */
/* /1* assert(tr.randomize with {pload.size==200;}); *1/ */
/* req = new("req"); */
/* assert(req.randomize with {pload.size==200;}); */
/* `uvm_info("main_phase", $sformatf("this is the %0d drive----------------------", i), UVM_LOW) */
/* drive_one_pkt(req); */
/* /1* drive_one_pkt(tr); *1/ */
/* end */
/* repeat (5) begin */
/* @(posedge vif.clk); */
/* vif.valid<=1'b0; */
/* end */
/* phase.drop_objection(this); */
/* endtask: main_phase */
task main_phase(uvm_phase phase);
vif.data <= 8'b0;
vif.valid <= 1'b0;
while(!vif.rst_n) begin
@(posedge vif.clk);
end
while (1) begin
/* seq_item_port.get_next_item(req); */
seq_item_port.try_next_item(req);
if (req==null) begin
@(posedge vif.clk);
end else begin
drive_one_pkt(req);
seq_item_port.item_done();
end
end
endtask
task drive_one_pkt(my_transation tr);
byte unsigned data_q[];
int data_size;
data_size = tr.pack_bytes(data_q) / 8;
`uvm_info("drive_one_pkt", "start drive one packet", UVM_LOW);
repeat (3) begin
@(posedge vif.clk);
end
for (int i = 0; i < data_size; i++) begin
@(posedge vif.clk);
vif.valid<=1'b1;
vif.data<= data_q[i];
end
@(posedge vif.clk);
vif.valid<=1'b0;
`uvm_info("drive_one_pkt", "one packet send over", UVM_LOW);
endtask
/* task drive_one_pkt(my_transation tr); */
/* bit [7:0] data_q[$]; */
/* pack_bytes(data_q, tr.dmac, 6); */
/* pack_bytes(data_q, tr.smac, 6); */
/* pack_bytes(data_q, tr.ether_type, 2); */
/* for (int i = 0; i < tr.pload.size; i++) begin */
/* data_q.push_back(tr.pload[i]); */
/* /1* $write("push %0d %0h|", i, tr.pload[i]); *1/ */
/* end */
/* pack_bytes(data_q, tr.crc, 4); */
/* `uvm_info("drive_one_pkt", "start drive one packet", UVM_LOW); */
/* repeat (3) begin */
/* @(posedge vif.clk); */
/* end */
/* while (data_q.size>0) begin */
/* @(posedge vif.clk); */
/* vif.valid<=1'b1; */
/* vif.data<= data_q.pop_front; */
/* end */
/* @(posedge vif.clk); */
/* vif.valid<=1'b0; */
/* `uvm_info("drive_one_pkt", "one packet send over", UVM_LOW); */
/* endtask: drive_one_pkt */
/* function void pack_bytes(ref bit [7:0] data_q[$],input bit [47:0] data_i, input byte num); */
/* for (int i = 0; i < num; i++) begin */
/* data_q.push_back(data_i[7:0]); */
/* data_i=data_i>>8; */
/* end */
/* endfunction: pack_bytes */
endclass : my_driver
`endif
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。