Почему функция $ display внутри тестовой среды не отображает 100 значений? - PullRequest
0 голосов
/ 05 мая 2020

Исходный код для тестовой среды

`timescale 10ns/1ns

module mux_tb();

integer j;
reg clk,rst,bistForDeterministic,enable,bistMode,deterministicEnable;
wire [127:0] valueI;
reg [7:0] iterate;
wire [9:0] seedValue;

MemoryModule mm (iterate,clk,rst,bistMode,deterministicEnable,seedValue);
mux m (clk,rst,bistMode,enable,seedValue,valueI);

always #3 clk = ~clk;

initial begin
    j=0;
    clk = 0;
    rst = 1;
    #5 rst = 0;
    iterate=0;
    bistForDeterministic = 1;
    deterministicEnable=1;
    bistMode = 1;
    enable = 0;
end

always@(negedge clk)begin : break_block

    if(j==100)begin
        disable break_block;
    end

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

        @(seedValue)begin
            //$display("%h  %d",seedValue,$time);
            iterate<=iterate+1;
            deterministicEnable<=0;
            enable<=1;
        end


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

    j=j+1;
end
endmodule

Исходный код для модуля памяти

module MemoryModule (input wire[7:0] iterate, input wire clk, input wire rst, input wire bistMode,input wire deterministicEnable,output reg[9:0] seedValue);

reg [9:0] seedVal[0:2];


always@(posedge clk)begin

if(rst)begin
    seedValue<=10'b0000000000;
    seedVal[0]<=10'b0000000000;
    seedVal[1]<=10'b0000000000;
    seedVal[2]<=10'b0000000000;
end
else begin
    seedVal[0]<=10'b1001100101;
    seedVal[1]<=10'b1111111111;
    seedVal[2]<=10'b0000011111;
end
    if((bistMode==1) && (deterministicEnable==1))begin
        seedValue=seedVal[iterate];
    end
end

endmodule

Исходный код для модуля мультиплексирования

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

reg[31:0] myPatterns[0:3],Temporary;
integer i,j;
reg [9:0] flag;



always begin
    @(enable)begin
        flag=seedValue;
        if((flag!=10'bxxxxxxxxxx) || (flag!=10'b0000000000))begin
            Temporary={12'b000000000000,seedValue};
            flag=10'b0000000000;
        end
        else begin
            Temporary=32'b11111111111111111111111111111111;
        end

    end
end

always@(posedge clk)begin : break_block


        if(rst)begin
            myPatterns[0]<=32'b00000000000000000000000000000000;
            myPatterns[1]<=32'b00000000000000000000000000000000;
            myPatterns[2]<=32'b00000000000000000000000000000000;
            myPatterns[3]<=32'b00000000000000000000000000000000;
            Temporary <= 32'b00000000000000000000000000000000;          
        end


        else begin
            if((bistMode==1) && (enable==1))begin

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

            end 
        end
end
endmodule

1 Ответ

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

Оператор $display выполняется только один раз, потому что эта строка блокируется:

    @(seedValue)begin

seedValue изменяется один раз за 150 нс с 0 на 'h265, но затем никогда не изменяется снова. Это означает, что вы больше никогда не выполните оператор $display. Вам необходимо перепроектировать свой код, чтобы он отображался именно тогда, когда вы хотите.


У вас не должно быть других операторов управления синхронизацией внутри синхронизированного блока always. @(seedValue) и @(valueI) - операторы управления синхронизацией, и они находятся в блоке always@(negedge clk). Когда выполняется $display, требуется несколько clk циклов.

...