2017-01-05 13 views
-1

Как написать wdata [((8 * j) +7): (8 * i)] = $ random; на языке программирования Verilog? , где i и j - переменная типа reg. Modelsim дает ошибку для переменной постоянного диапазона. Как я мог написать его надлежащим образом.Разбивка битов в verilog

ответ

0

Вы должны думать от Hardware перспективного для решения.

Это одно решение. Надеюсь, что это вам поможет.

module temp(clk); 
    input clk; 
    reg i, j; 
    reg [23:0] register, select; 
    wire [23:0] temp; 

    initial 
    begin 
     i = 'd1; 
     j = 'd1; 
    end 

    generate 
    for(genvar i = 0; i<24; i++) 
    begin 
     assign temp[i] = select[i] ? $random : register[i]; 
    end 
    endgenerate 

    always @ (posedge clk) 
    begin 
     register <= temp; 
    end 

    always @ * 
    begin 
     select = (32'hffff_ffff << ((j<<3)+8))^(32'hffff_ffff << (i<<3)); 
    end 
endmodule 
+0

благодарит Karan за помощью. – Xeroxpop

+0

Пожалуйста, отметьте ответ, чтобы закрыть вопрос, если проблема была решена. –

0

Используйте решетчатую конструкцию массива. Вы можете найти более подробное объяснение на Array slicing Q&A

bit [7:0] PA, PB; 
int loc; 

initial begin 
    loc = 3; 
    PA = PB;      // Read/Write 
    PA[7:4] = 'hA;    // Read/Write of a slice 
    PA[loc -:4] = PA[loc+1 +:4]; // Read/Write of a variable slice equivalent to PA[3:0] = PA[7:4]; 
end 

Verilog 2001 Синтаксиса

[M -: N] // negative offset from bit index M, N bit result 
[M +: N] // positive offset from bit index M, N bit result 
+0

благодарит за помощь – Xeroxpop