Перейти к содержанию

    

Параметризируемая конкатенация

Всем привет!

 

Вопрос знатокам:

 

Есть несколько шин, допустим, по N бит. Их количество пусть задается параметром pNUM. Эти шины нужно объединить в одну, разрядностью, соответственно pNUM*N бит (конкатенировать).

 

Какой конструкцией SystemVerilog это можно описать? С условием "написать и забыть", не правя вручную каждый раз, при изменении значений N и pNUM.

Изменено пользователем nice_vladi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

parameter N=8,
parameter pNUM=4
...
input [N*pNUM-1:0] input_bus;

wire [N-1:0] bus0=input_bus[0*N +: N];
wire [N-1:0] bus1=input_bus[1*N +: N];
wire [N-1:0] bus2=input_bus[2*N +: N];
wire [N-1:0] bus3=input_bus[3*N +: N];

 

Только так - объединением в одну общую толстую шину. По-другому - почти что никак. Ограничения верилога. Используйте систем верилог.

 

UPD:

А чисто конкатенация будет вот так:

parameter N=8,
parameter pNUM=4
...
input [N-1:0] bus0,
input [N-1:0] bus1,
input [N-1:0] bus2,
input [N-1:0] bus3,
output [N*pNUM-1:0] output_bus
...
assign output_bus = {bus3, bus2, bus1, bus0};

Опять же, параметризовать этот ассигн в рамках верилога - невозможно.

Изменено пользователем ilkz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
....

Только так - объединением в одну общую толстую шину. По-другому - почти что никак. Ограничения верилога. Используйте систем верилог.

 

Очепятался) для SystemVerilog.

 

И я имел в виду обратную задачу: пачку верёвок упаковать в одну. :laughing:

Изменено пользователем nice_vladi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

...

Есть несколько шин, допустим, по N бит. Их количество пусть задается параметром pNUM. Эти шины нужно объединить в одну, разрядностью, соответственно pNUM*N бит (конкатенировать).

 

Какой конструкцией SystemVerilog это можно описать? С условием "написать и забыть", не правя вручную каждый раз, при изменении значений N и pNUM.

Все зависить от того как заданны входные шины.

Если шина задана как упакованный массив : wire|reg [pNUM-1:0][N-1:0]; bus_in то делать ничего не нужно.

Если шины задана как неупакованный массив : wire|reg [N-1:0] bus_in [0:pNUM-1]; то объединяем в for цикле

generate
  for (genvar gi=0; gi<pNUM; ++gi) begin
    assign bus_ou_w[gi*N +: N] = bus_in[gi];
  end 
endgenerate

always_ff @(posedge clk) begin
  for (int ii=0; ii<pNUM; ++ii) begin
    bus_ou_r[ii*(N+1)-1 : ii*N] <= bus_in[ii];
  end 
end

А вот если входные шины заданны индивидуально - wire|reg [N-1:0] bus0_in, bus1_in, bus_in_A, bus_in_B, ... то тут универсального решения нет. В некоторых случаях можно выкрутится с помощью макросов c постановками и условием по pNUM.

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или проще

module bus
#(
    parameter W = 8,
    parameter N = 4
)
(
    input [W-1:0] bus_in [0:N-1],
    output [W*N-1:0] bus_out
);
    genvar i;
    
    generate
        for(i = 0; i < N; i++)begin : b
            assign bus_out[W*(i+1)-1:W*i] = bus_in[i];
        end
    endgenerate

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Приветствую!

 

Все зависить от того как заданны входные шины.

Если шина задана как упакованный массив : wire|reg [pNUM-1:0][N-1:0]; bus_in то делать ничего не нужно.

...

 

А если как неупаковынный, то сначала упаковать :)

 

 module test #(
  parameter DATA_W = 2,
  parameter CNT    = 4
) (
  input  [DATA_W-1:0]     in [CNT-1:0],

  output [CNT*DATA_W-1:0] out
);

logic [CNT-1:0][DATA_W-1:0] pack;

always_comb
   for( int i = 0; i < CNT; i++ )
     pack[i] = in[i];

assign out = pack;

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация