首页 > 解决方案 > 如何从 1 到 52 System Verilog 生成可合成的伪随机发生器

问题描述

有人可以解释如何创建一个范围为 1 到 51 的伪数生成器,并且可以将其值放在类似 for 循环的东西中。这必须在 System Verilog 中并且可以综合。我已经阅读了一些 CRC 和 LFSR,但不太确定如何修改它们以使其适合我需要的指定值 (1-52) 以及如何将其适合 for 循环,因为大多数示例占用了整个模块。感谢您的时间。

initial begin
for(int i = 0; i < 52; i++) begin
  
        int j = // insert PSEUDO RANDOM NUM GEN 0 to 51
  
            if(array[j] == 0)begin
                i = i-1;
                continue;
            end
            else 
            array2[i] = array[j];
             array[j] = 0;
        end
end

(array 和 array2 都有 52 个位大小为 4 的值)

标签: system-verilogquartus

解决方案


我不知道您的应用程序是什么,但是您可以做的是在模环 mod 53 中生成数字(53 是质数)。由于您没有提到任何其他要求,我将采用我能想象到的最简单的生成器,它可以在没有乘法的情况下执行,并且会生成数字 1 <= n < 52。

function [5:0] next_item(input logic [5:0] v);
  if(v < 26) begin
    next_item = (v << 1); // 2 * v % 53 = 2 * v
  end
  else if(v > 26) begin
    // (2 * v) % 53 = (2 * v - 52 - 1) % 53 = 2 * (v - 26) - 1
    next_item = (((v - 26) << 2) - 1);
  end
  else begin
    // v = 26, you want to exclude 2 * v % 53 = 52, so we skip it
    // by applying the next item again, and it will be 
    next_item = 51;
  end
endfunction

你可以像这样使用它

parameter SEED = 20; // any number 1 <= N < 52 you like
initial begin
int j = SEED;
for(int i = 0; i < 52; i++) begin
  
      if(array[j-1] == 0)begin
        i = i-1;
        continue;
      end
      else begin
       array2[i] = array[k];
      end
   
      j = next_item(j);
end


推荐阅读