Как генерировать случайные образцы, используя LFSR, и я использую различные частичные начальные значения - PullRequest
0 голосов
/ 03 мая 2020

Как я уже сказал, провод seedValue содержит 10-битное частичное начальное число, которое я хочу назначить регистру, когда первый сигнал равен 1, он поступает в блок, и последний оператор этого блока назначает провод seedValue для регистра temp так, что при выполнении условия if if ((temp! = 10'b0000000000) || (temp! = 10'bxxxxxxxxxx)) он входит в блок, а затем seedValue объединяется с 12'b000000000000, а затем я получаю свой 32-битный начальное значение, через которое я ожидаю получить случайные шаблоны из LFSR, после чего регистру temp назначаются нулевые значения, так что должен выполняться блок else, от которого я ожидаю получить случайные шаблоны, но следующий код не работает. Я новичок в мире Verilog и FPGA, кто-нибудь, пожалуйста, помогите мне. Следующий код написан на Verilog.

module TestPatternGenerator(input wire clk, input wire rst, input wire enable, 
input wire sel, input wire[9:0] seedValue, output reg[127:0] valueO);

integer i;
reg [31:0] patternGenerate[0:3],tempOne;    
reg [9:0] temp;


always @(posedge clk)begin

    if((sel == 1)&&(enable==1))begin 

        if(rst)begin
            valueO = 128'b0;
            patternGenerate[0]<=32'b0;
            patternGenerate[1]<=32'b0;
            patternGenerate[2]<=32'b0;
            patternGenerate[3]<=32'b0;
            tempOne <= 32'b11111111111111111111111111111111;
            temp <= seedValue;
        end

        else if((temp!=10'b0000000000) || (temp!=10'bxxxxxxxxxx))begin
                tempOne <= {12'b000000000000,seedValue};
                $display("%h",tempOne);
                temp <= 10'b0000000000;
        end 

        else begin
            for(i=0;i<4;i=i+1)begin
                tempOne = {(tempOne[31] ^ tempOne[25] ^ tempOne[22] ^ tempOne[21] ^ tempOne[15] ^ tempOne[11] ^ tempOne[10] ^ tempOne[9] ^ tempOne[7] ^ tempOne[6] ^ tempOne[4] ^ tempOne[3] ^ tempOne[1] ^ tempOne[0]), tempOne[31:1]};
                patternGenerate[i] = tempOne;
            end
            valueO = {patternGenerate[3],patternGenerate[2],patternGenerate[1],patternGenerate[0]};

        end

    end
    i=i+1;
end
endmodule

код для testbench приведен ниже

`timescale 10ns/1ns
module test_controller();

integer j;
reg [127:0] key_byte,valueI,oraI;
wire [127:0] state_byte;
wire [9:0] seedValue;
wire [47:0] result;
reg [7:0] iterate;
reg clk,rst,bistForDeternimistic,deterministicEnable,ecryptionEnable,enable,decryptionEnable,decryptionSecondEnable,bistMode,bistForEncryption,bistForDecryption,oraEnable;


wire [127:0] state_out_dec,state_out_enc,state_second_dec;
wire [31:0] state_out_ora;
reg [31:0] signatureToMatch;
wire load,ready;


TestPatternGenerator tpg (clk,rst,enable,bistMode,seedValue,state_byte);


always #3 clk = ~clk;

initial begin
    bistMode <= 1;
    key_byte <= 128'h5468617473206D79204B756E67204675;
    bistForDecryption <= 0;
    clk<=0;
    rst<=1;
    #5 rst<=0;
    iterate<=0;
    j<=0;
    bistForDeternimistic<=1;
    enable<=1;
end

always@(negedge clk)begin : deterministic_block
        if(j==100)begin
            disable deterministic_block;
        end

        if((bistMode==1) && (bistForDeternimistic==1))begin

            @(state_byte)begin
                $display("%h   %d",state_byte,$time);
            end
        end

        j=j+1;
end
endmodule

вывод. Я получаю только первый тестовый шаблон, но он должен сгенерировать 100 тестовых шаблонов. Поэтому, кроме первого тестового шаблона, я не получаю остальные 99 шаблонов.

1 Ответ

0 голосов
/ 05 мая 2020

Когда я запускаю ваш код, я не вижу никаких шаблонов (операторы $display не выполняются). Это связано с тем, что сигнал enable неизвестен, когда rst равен 1.

Если я задержу нарастание фронта rst после того, как enable установлено в 1, я вижу 100 паттернов:

initial begin
    bistMode <= 1;
    key_byte <= 128'h5468617473206D79204B756E67204675;
    bistForDecryption <= 0;
    clk<=0;
    rst<=1;
    iterate<=0;
    j<=0;
    bistForDeternimistic<=1;
    enable<=1;
    #5 rst<=0;
end

Это частичный вывод:

00000000000000000000000000000000                      3
afffffff5fffffffbfffffff7fffffff                      9
2affffff55ffffffabffffff57ffffff                     15
72afffffe55fffffcabfffff957fffff                     21
272affff4e55ffff9cabffff3957ffff                     27
4272afff84e55fff09cabfff13957fff                     33

Вы упоминаете сигнал seedValue в своем вопросе, но он не является недостижимым (значение z). Вы объявили сигнал как wire, и по умолчанию для проводов установлено значение z, когда они не назначены.

Чтобы управлять им с известным значением для полной продолжительности моделирования, вы можете использовать, например, :

wire [9:0] seedValue = 1;

Если вы хотите управлять им так же, как ваши другие входы, вы должны объявить как reg.

...