随机映射位在Verilog



我试图创建一个简单的,可合成的模块,将输出的位随机映射到输入的位,没有重复。例如,对于8位的输入/输出:

module Scrambler(in, out);
    parameter WIDTH = 8;
    input wire [WIDTH-1:0] in;
    output wire [WIDTH-1:0] out;
    assign out[0] = in[6];
    assign out[1] = in[5];
    assign out[2] = in[3];
    assign out[3] = in[7];
    assign out[4] = in[1];
    assign out[5] = in[4];
    assign out[6] = in[0];
    assign out[7] = in[2];
endmodule

我想用生成块替换一系列赋值语句,以便输入/输出的宽度可以完全参数化。我只是想不出一种方法来创建一个循环序列的随机值只在合成时间。合成后,映射将永远不需要更改。

谢谢你的帮助!

错误的工具,就像试图用螺丝刀的柄来钉钉子一样。使用锤子,就像下面几行Perl(或者您自己选择的锤子):

use List::Util qw(shuffle);
my $n = shift() - 1;
my @arr = shuffle(0 .. $n);
print "assign out[$_] = in[$arr[$_]];n" for 0 .. $n;

我们都使用自动生成的Verilog代码。这也没什么不同。只需将输出复制并粘贴到Verilog文件中。

最新更新