system-verilog - 如何从 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 的值)
解决方案
我不知道您的应用程序是什么,但是您可以做的是在模环 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
推荐阅读
- flutter - 不同类型的 Dart 平等
- javascript - javascript 两个窗口比较内容?
- maven - 由于日志输出过长,WSL2 控制台崩溃
- leaflet - 在 Leaflet 的多面体中渲染没有孔的重叠多边形
- react-native - React Native - 如何选择多个项目并显示它们?
- spring-boot - 在 ExternalContext 中找不到作为资源错误(Amazon Elastic Beanstalk / Spring Boot / JSF + Primefaces)
- java - Java GridBagLayout 在编译时默认左上角
- mysql - SQL分组后如果组中存在值,则决定输出
- angular - 如何在 Angular Observable 订阅函数中正确设置值
- typescript - 如何将 ts 文件捆绑到一个 index.d.ts 文件中?