基本スコアボードのサンプル

以下のコードは、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