基本スコアボードのサンプル
以下のコードは、modelsim ase10.1d にて、以下の手順で動作確認を行いました。
vlib work
vlog -sv tb_top.sv
vsim -c tb_top -do "run -all;quit"
--- tb_top.sv (module)
`timescale 1ps/1ps
module tb_top;
`include "data_item.sv"
`include "c_scrbd.sv"
c_scrbd #(data_item) _scrbd;
initial begin
int i;
data_item item;
logic [7:0] data_q[$];
_scrbd = new();
fork _scrbd.run(); join_none
// データ生成
for(i=0; i<8; i=i+1)begin
data_q.push_back($urandom_range(255,0));
end
for(i=0; i<8; i=i+1)begin
item = new("EXP");
item.set_data(i, data_q[i]);
_scrbd.write_exp(item);
end
for(i=0; i<8; i=i+1)begin
item = new("OBS");
item.set_data(i, data_q[i]);
_scrbd.write_obs(item);
end
#100 $finish;
end
endmodule
--- c_scrbd.sv (class)
class c_scrbd #(type T = int);
string name = "m_scrbd";
T exp_q[$];
T obs_q[$];
function void set_name(string _name);
name = _name;
endfunction
function void write_exp(T item);
exp_q.push_back(item);
endfunction
function void write_obs(T item);
obs_q.push_back(item);
endfunction
virtual task run;
forever begin
wait(obs_q.size()!=0);
if(exp_q[0].compare(obs_q[0]))begin
$display("%0t [SCRBD] %s compare OK ===================================", $time, name);
exp_q[0].print;
end else begin
$display("%0t [SCRBD] %s compare NG ===================================", $time, name);
exp_q[0].print;
obs_q[0].print;
end
exp_q.delete(0);
obs_q.delete(0);
end
endtask
endclass
--- data_item.sv (class)
class data_item;
string name;
logic [7:0] data0;
logic [7:0] data1;
function new (string name="data_item");
this.name = name;
endfunction
function bit compare(data_item item);
if(data0===item.data0 && data1===item.data1)begin
return 1;
end else begin
return 0;
end
endfunction
function void set_data(logic [7:0] data0, data1);
this.data0 = data0;
this.data1 = data1;
endfunction
function void print;
$display("----------------------------------------------------------");
$display("%0t [%s] data0 : %02xh", $time, name, data0);
$display("%0t [%s] data1 : %02xh", $time, name, data1);
$display("----------------------------------------------------------");
endfunction
endclass