У меня есть испытательный стенд UVM для небольшого блока в моем чипе. В нем есть агент с драйвером, который управляет данными в виртуальном интерфейсе, который выглядит примерно так:
interface my_if (input bit clk);
logic [3:0] opcode;
// Clocking block for the driver
clocking drvClk @(posedge clk);
output opcode;
endclocking
// Clocking block for the monitor
clocking monClk @(posedge clk);
input opcode;
endclocking
endinterface
Я использую этот интерфейс в своем драйвере следующим образом:
class my_driver extends uvm_driver #(my_tr);
my_if vif;
...
virtual task run_phase(uvm_phase phase);
super.run_phase(phase);
forever begin
seq_item_port.get_next_item(req);
// Drive the transaction onto the interface
// and wait for next clock
vif.opcode <= req.opcode;
@(vif.drvClk);
seq_item_port.item_done();
end
endtask
endclass
Насколько я могу судить, это рекомендуемый способ работы, и он хорошо работает. Проблема возникает, когда я интегрирую этот агент в тестовую среду более высокого уровня. В этом случае агент теперь пассивен, а драйвер не построен. Я назначаю значение кода операции интерфейсу, чтобы монитор мог его наблюдать. Вот фрагмент моего жгута проводов верхнего уровня:
module my_top();
bit clk = 0;
always #5 clk = !clk;
// instantiate the interface
my_if my_if_inst(.clk(clk));
// instantiate my dut
my_dut dut(...);
// pull out the internal opcode signal and assign it
// to the interface
assign my_if_inst.opcode = dut.submodule.opcode;
// Set the virtual interface inside the agent
initial begin
uvm_config_db#(virtual my_if)::set(uvm_root::get(),"uvm_test_top.tb.env.my_agent", "vif", my_if_inst);
end
endmodule
Когда я запускаю это в NC, я получаю предупреждение:
ncelab: *W,ICPAVW: Illegal combination of driver and procedural assignment to variable opcode detected (output clockvar found in clocking block)
Это имеет смысл, поскольку интерфейс определяет этот сигнал как выход для блока drvClk, и я выполняю назначение на верхнем уровне. Я могу просто проигнорировать это предупреждение (код работает нормально), но я бы предпочел закодировать его так, чтобы он работал чисто. Каков рекомендуемый способ сделать это? Я избавился от блока синхронизации для водителя, и это работает, но я думаю, что настраиваю себя на условия гонки, если я это сделаю.