Что означает «виртуальный tinyalu_bfm» в приведенном ниже коде SystemVerilog? пример:
uvm_config_db #(virtual tinyalu_bfm)::set(null, "*", "bfm", bfm);
будет ли иметь значение, если я опущу виртуальное ключевое слово? Просто любопытно, потому что обычно oop значение виртуального применяется только к классам или членам класса, и вот пример, где его применяют к интерфейсу, передаваемому в функцию stati c, которая является частью пакета UVM ... просто хотел знаю, почему мне нужно назвать его вирулентным в этом случае и какова его цель сделать его виртуальным.
module top;
// UVM Framework
import uvm_pkg::*;
`include "uvm_macros.svh"
import tinyalu_pkg::*; //import all tb classes and types
tinyalu_bfm bfm();
// invoke APIs from uvm_pkg to start test...
initial begin
uvm_config_db #(virtual tinyalu_bfm)::set(null, "*", "bfm", bfm);
run_test();
end
endmodule : top
interface tinyalu_bfm;
byte unsigned A;
byte unsigned B;
bit clk;
bit reset_n;
initial begin
clk = 0;
forever begin
#10;
clk = ~clk;
end
end
task reset_alu();
reset_n = 1'b0;
@(negedge clk);
@(negedge clk);
reset_n = 1'b1;
start = 1'b0;
endtask : reset_alu
task send_op(input byte iA, input byte iB, input operation_t iop, output shortint alu_result);
// ...
endtask : send_op
endinterface : tinyalu_bfm
еще раз посмотрите ... объект интерфейса также объявлен виртуальным ... почему?
// FILE: random_test.svh
class random_test extends uvm_test;
// ...
virtual tinyalu_bfm bfm;
function new (string name, uvm_component parent);
super.new(name,parent);
if(!uvm_config_db #(virtual tinyalu_bfm)::get(null, "*","bfm", bfm))
$fatal("Failed to get BFM");
endfunction : new
task run_phase(uvm_phase phase);
//...
endtask : run_phase
endclass