在systemverilog中使用Random的随机1位和2位错误

在systemverilog中使用Random的随机1位和2位错误,random,error-handling,verilog,system-verilog,Random,Error Handling,Verilog,System Verilog,我正在使用错误检测块。我需要使用SystemVerilig随机翻转1位数据。我该怎么做?我还想做同样的事情,翻转2个随机数据位 正在使用汉明码。所以奇偶校验和数据中的随机位需要翻转。最简单的方法是使用$uradom\u range(0,msb)选择要损坏的位。例如: module test(); parameter DATA_WIDTH = 29; parameter IDX_WIDTH = $clog2(DATA_WIDTH); logic [DATA_WIDTH-1:0] data; l

我正在使用错误检测块。我需要使用SystemVerilig随机翻转1位数据。我该怎么做?我还想做同样的事情,翻转2个随机数据位


正在使用汉明码。所以奇偶校验和数据中的随机位需要翻转。

最简单的方法是使用
$uradom\u range(0,msb)
选择要损坏的位。例如:

module test();

parameter DATA_WIDTH = 29;
parameter IDX_WIDTH = $clog2(DATA_WIDTH);

logic [DATA_WIDTH-1:0] data;
logic [IDX_WIDTH-1:0]  idx_to_flip;

initial begin
   data = $urandom();
   $display("Original data = %x", data);

   idx_to_flip = $urandom_range(0, DATA_WIDTH-1);
   $display("Flipping data bit idx %d", idx_to_flip);

   data[idx_to_flip] = !data[idx_to_flip];
   $display("Corrupted data = %x", data);
end

endmodule
这对于单个位来说非常简单。如果要损坏2个位,则需要稍微复杂一点,以确保选择的第二个位索引与第一个位索引不同。有两种选择:

1) 循环第二个$URADOM_range()调用,直到它生成一个不同于第一个随机数的值

2) 创建一个包含两个“rand”字段的类,并使用约束确保值不相同:

class Corruption;
  rand bit [IDX_WIDTH-1:0] corrupt_idx1;
  rand bit [IDX_WIDTH-1:0] corrupt_idx2;
endclass

Corruption corr = new;

initial begin
   corr.randomize() with {corrupt_idx1 != corrupt_idx2;};
   $display("Bit indices to flip: %d and %d", corr.corrupt_idx1, corr.corrupt_idx2);
end

您可以声明一个位宽与“数据”大小相同的变量。 假设“数据”大小为8位(例如数据_8b),则可以声明大小为8位的临时变量(例如错误_8b),并且可以使用简单的EXOR逻辑插入多位错误。请参阅下面的代码片段

  error_inject_8b[0] = 1; 
  error_inject_8b[1]  = 1; 
  data_8b = data_8b  ^ error_inject_8b; //injects error in 0th and 1st bits of data

  error_inject_8b = 0;//Reset the errors
  error_inject_8b = $random;
  data_8b = data_8b  ^ error_inject_8b;//Injects error in randomly selected bits 
您还可以编写约束使用概念随机化,以根据您的需求随机化错误注入