以下のコードは、modelsim ase10.1d にて、以下の手順で動作確認を行いました。
vlib work
vlog -sv tb_top.sv
vsim -c tb_top -do "run -all;quit"
--- tb_top.sv (module)
`timescale 1ps/1psmodule 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; endendmodule--- 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 endtaskendclass--- 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("----------------------------------------------------------"); endfunctionendclass