2015-10-17 65 views
1

我正在嘗試創建一個簡單的可合成模塊,它隨機將輸出的位映射到輸入的位而不重複。例如,像這樣對8位輸入/輸出:在Verilog中隨機映射位

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 

我想和一個生成塊,以取代系列分配語句,以使在輸入/輸出的寬度可以是完全參數化。我只是想不到在合成時創建一系列循環隨機值的方法。綜合後,映射永遠不需要改變。

感謝您的幫助!

回答

0

你需要的東西叫做Random Permutation

你可以嘗試實現它是這樣的方式:

wire [7:0] inp; 
reg [7:0] outp; 
... 
always @* 
begin : random_permutator 
    integer i; 
    integer permutation [0:7]; 

    // here is some algorithm that generates your permutation into the array permutation[] 
    ... 

    for(i=0;i<8;i=i+1) 
     outp[permutation[i]] = inp[i]; 
end 

前提是你的算法中是靜態的,即產生相同的結果每次運行時(你可能需要在這裏實現自己的僞隨機數發生器,而不是依賴在$random),一個好的合成工具將正確實施它。