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

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

Всем привет!

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

Есть несколько шин, допустим, по 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

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(ilkz @ Feb 6 2018, 07:18) <{POST_SNAPBACK}>
....
Только так - объединением в одну общую толстую шину. По-другому - почти что никак. Ограничения верилога. Используйте систем верилог.


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

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

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


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

Цитата(nice_vladi @ Feb 6 2018, 09:58) <{POST_SNAPBACK}>
...
Есть несколько шин, допустим, по 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

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(RobFPGA @ Feb 6 2018, 11:05) <{POST_SNAPBACK}>
Приветствую!

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


А если как неупаковынный, то сначала упаковать sm.gif

Код
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

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


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

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

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

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

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

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

Войти

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

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