1

テストベンチから、デザインでバスを破損する必要があります。確率変数を使用してビット位置を選択しています ( bit_sel)

bit_sel = $urandom_range(0,MAX_LENGTH-1);

バスは RTL の奥深くにあり、幅はMAXLENGTHです。

wire [MAX_LENGTH-1:0] BUS_TO_BE_FORCED;

TB では、次の行を使用してバスを破損しています。

force TOP.DUT.....BUS_TO_BE_FORCED[bit_sel] = ~TOP.DUT.....BUS_TO_BE_FORCED[bit_sel];

しかし、コンパイルエラーが発生します。これを行う最善の方法は何ですか?1ビットだけ反転したい。

4

4 に答える 4

3

代わりに、XOR マスクを使用してビットを反転できます。

wire [MAX_LENGTH-1:0] corrupt_bits = 1 << $urandom_range(0,MAX_LENGTH-1);

force BUS_TO_BE_FORCED = corrupt_bits ^ BUS_TO_BE_FORCED;
于 2013-06-15T09:32:58.263 に答える
2

LHSは、ベクトル ネットの一定のビット選択でなければなりません (とりわけ)。そう、

force TOP.DUT.....BUS_TO_BE_FORCED[0]

大丈夫ですが、

force TOP.DUT.....BUS_TO_BE_FORCED[bit_sel]

そうではありません。セレクターは一定である必要がないため、大きな case ステートメントを試すことができます。

case(bit_sel)
 0: force TOP.DUT.....BUS_TO_BE_FORCED[0] = ...
 ...etc
于 2013-06-14T11:11:03.280 に答える
0

同様の問題があり、信号と同じ幅の別のベクトルを使用して破損させることにしました。また、必要に応じて DUT の任意の部分にバインドできるように、これをインターフェイスにカプセル化しました。以下のコードを参照してください。

import uvm_pkg::*;
`include "uvm_macros.svh"

interface sync_signal_fault_injector #(
  parameter int SIGNAL_WIDTH = 1
) (
  input                     clk,
  input                     reset,
  input [SIGNAL_WIDTH-1:0]  signals
);

  bit [SIGNAL_WIDTH-1:0] toggle_bits = '0;

  class sync_signal_fault_injector_c extends uvm_object implements fivip_pkg::Injectable;
    function new(string name="fault_injector");
      super.new(name);
    endfunction

    virtual function int unsigned get_size();
      return SIGNAL_WIDTH;
    endfunction

    virtual task inject(ref int unsigned indices[], input int unsigned delay);
      repeat (delay) @(posedge clk);

      foreach (indices[id]) begin
        int unsigned bit_index = indices[id];
        if (bit_index >= get_size()) begin
          `uvm_fatal("BOUNDS",
            $sformatf("Tried to access bit %0d but signal bus is only of size %0d", id, get_size())
          )
        end
        // Prepare toggle bits
        toggle_bits[bit_index] = 1;
      end

      force signals = signals ^ toggle_bits;
      @(posedge clk);
      release signals;
      // Reset toggle bits
      toggle_bits = '0;
    endtask

  endclass

  sync_signal_fault_injector_c fault_injector = new;
endinterface
于 2018-06-13T20:24:42.493 に答える