Синхронизация SystemVerilog между драйвером / DUT / монитором - PullRequest
0 голосов
/ 24 июня 2018

У меня есть проект проверки синхронного FIFO, я создал драйвер, и он был успешным. После этого я построил монитор и табло. Проблемы, возникающие при запуске тестового стенда, состоят в том, что я не контролирую, что передается на монитор, что я читаю с монитора, это отложенная версия того, что получает проверяемое устройство (входные данные и выходные данные). Так что я всегда получаю совпадение с пропущенными данными на табло. Я новичок, и это мой первый проект. Сначала я не использовал блоки тактирования, подумал об их использовании позже, но, с моей точки зрения, они только усложнили синхронизацию монитора и проверяемого устройства.

Я сделал перекос входа и выхода блока тактирования монитора равным 1ps, то же самое относится и к блоку тактирования драйвера. Я действительно не понимаю, что мне делать. Можете ли вы порекомендовать мне некоторые материалы для чтения?

Снимки Waveform Viewer / данные уведомлений фактически попадают в память fifo со скоростью 75ps

Снимок консоли

Снимок средства просмотра формы волны

Вот мой код для водителя, монитора, табло.

/DRIVER/
`include "interface.sv"
`define driv_intf vif.driv.driver_cb
`define mon_intf vif.mon.monitor_cb
class driver;


int no_transactions;
transaction trans;
mailbox gen2drive;
virtual intf vif;

function new(virtual intf vif, mailbox gen2drive);

this.vif = vif;
this.gen2drive = gen2drive;

endfunction

task reset();
$display("------[DRIVER] - RESET TASK - Awaiting Reset--------");
wait(vif.reset);
    $display("--------- [DRIVER] Reset Started ---------");
    `driv_intf.wr <= 0;
    `driv_intf.rd <= 0;
    `driv_intf.din  <= 0;
    `driv_intf.en <= 0;  
	wait(!vif.reset);
	    $display("--------- [DRIVER] Reset has ended ---------");
endtask;

task enable();

repeat(5) begin
@(posedge vif.driv.clk)
vif.en <= 1'b1;
end

endtask

task drive();
transaction trans;
gen2drive.get(trans);
@(posedge vif.driv.clk);
		if(trans.wr && vif.en) begin
		`driv_intf.din <= trans.din;
		`driv_intf.rd <= trans.rd;
		`driv_intf.wr <= trans.wr;
		end
		
		if(trans.rd && vif.en) begin
		`driv_intf.din <= trans.din;
		`driv_intf.rd <= trans.rd;
		`driv_intf.wr <= trans.wr;
		end
no_transactions++;
endtask



task main(); 
		forever begin
			drive();
			end
endtask
endclass

/monitor/
`define driv_intf vif.driv.driver_cb
`define mon_intf vif.mon.monitor_cb

class monitor2;

virtual intf vif;


sb scoreboard = new();

function new(virtual intf vif);

this.vif=vif;
endfunction


task mon_push_pop();
begin
logic [31:0] datain;
logic [31:0] dataout;
forever begin
@(posedge vif.driv.clk);
if(vif.rd) begin
dataout = `mon_intf.dout;
scoreboard.compare(dataout);
end
if(vif.wr) begin
datain = `mon_intf.din;
scoreboard.pushItem(datain);
end
end
end
endtask
endclass

/SCOREBOARD/

class sb;

mailbox fifo = new(256);
integer size;
static int error = 0;

function new();

this.size = 0;

endfunction



task pushItem(bit [31:0] data);

if(size == 257)
$write("\nTime: %t | [Scoreboard] -- Over Flow has been Detected | Size = %0d",$time,size);
else
fifo.put(data);
$display("\n[SCOREBOARD]--- |Time:%0dns|Entered Value %h\n", $time, data);
size++;

endtask

task compare(bit [31:0] data);
bit [31:0] fifodata = 0;
if(size == 0) begin
$write("\nTime: %0tns | [Scoreboard -- Underflow has been detected | Size = %0d", $time,size);
end
else begin
fifo.get(fifodata);
if(data != fifodata ) begin
	$write("\nTime: %0tns | [Scoreboard -- Data Missmatch | Size = %0d, | Actual Data: %0h | Expected Data: %0h",$time,size,data,fifodata);
	 this.error++;
end
size--;
end
endtask




endclass

1 Ответ

0 голосов
/ 06 июля 2018

Во-первых, ваш код нуждается в большей структуре.Вы создаете объект табло внутри монитора и вызываете методы из монитора.Это плохое кодирование

Сначала создайте верхний класс среды, который создает объекты монитора, драйвера и табло.Реализуйте метод run () в драйвере, мониторе и табло и вызывайте их из класса среды, чтобы они могли работать параллельно.

Как только вы получите эту правильную структуру, при первой записи в fifo (который создает толчок в табло), а затем чтение должно соответствовать данным.

...