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

параметризация в verilog

доброго времени суток. Подскажите пожалуйста как решить подобную проблему:

в произвольном модуле есть строка

assign a = var_1 & var_2 & ... & var_n;

при этом все переменные m - разрядные. Чтобы не передавать в модуль все n переменных в модуль, была передана переменная

input [m*n-1:0] var,

Возник попрос, как, собственно, теперь вычислить переменную а?

Проблема не в том, чтобы передать в модуль нужное количество переменных, а в том, что заранее не известно, сколько раз писать, например, логическое умножение. Как воспользоваться циклами или generate-ами - не придумал.

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


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

доброго времени суток. Подскажите пожалуйста как решить подобную проблему:

в произвольном модуле есть строка

assign a = var_1 & var_2 & ... & var_n;

при этом все переменные m - разрядные. Чтобы не передавать в модуль все n переменных в модуль, была передана переменная

input [m*n-1:0] var,

Возник попрос, как, собственно, теперь вычислить переменную а?

Проблема не в том, чтобы передать в модуль нужное количество переменных, а в том, что заранее не известно, сколько раз писать, например, логическое умножение. Как воспользоваться циклами или generate-ами - не придумал.

 

assign a=&var

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


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

assign a=&var

боюсь, что такая запись сработает как побитное логическое умножение, то есть переменная размера М*Н превратится в 1 бит.

Если же явным образом указать размерность, то есть

assign a[m-1:0]=&var[как ее указать тут?]

, не уверен, что сработает.

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


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

боюсь, что такая запись сработает как побитное логическое умножение, то есть переменная размера М*Н превратится в 1 бит.

Если же явным образом указать размерность, то есть

assign a[m-1:0]=&var[как ее указать тут?]

, не уверен, что сработает.

Прошу прощения. Не дочитал про разрядность.

 

боюсь, что такая запись сработает как побитное логическое умножение, то есть переменная размера М*Н превратится в 1 бит.

Если же явным образом указать размерность, то есть

assign a[m-1:0]=&var[как ее указать тут?]

, не уверен, что сработает.

 

Попробуйте вот так:

module test
#(parameter N=8,M=4)
(
    input [N*M-1:0]var_n,
    output [M-1:0]A
);
    
genvar i;
    
    generate
        assign A[0]=&var_n[N-1:0];
        for(i=1;i<M;i=i+1) 
        begin: ABC
            assign A[i]=&var_n[(i+1)*N-1:N*(i-1)+N];
        end
    endgenerate

endmodule

RTL:

post-13420-1343299664_thumb.jpg

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


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

Дело вкуса, но для меня так нагляднее:

always @(*) begin
    a = {N{1'b1}};
    for (i=0; i<M; i=i+1) a = a & var[i*N +: N];
end

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


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

Дело вкуса, но для меня так нагляднее:

always @(*) begin
    a = {N{1'b1}};
    for (i=0; i<M; i=i+1) a = a & var[i*N +: N];
end

Как я понимаю, запись var[i*N +: N] подобна var[(i+1)*N-1 : i*N], но почуму же тогда моделсим ругается плохими словами

 

Range must be bounded by constant expressions
, если указать var[(i+1)*N-1 : i*N], но при этом все замечательно с var[i*N +: N]?

Буду признателен, если немного поясните.

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


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

но почуму же тогда моделсим ругается плохими словами

, если указать var[(i+1)*N-1 : i*N], но при этом все замечательно с var[i*N +: N]?

 

Ему хочется чтобы ширина шины не зависела от переменной, то есть от i. Разность выражений (i+1)*N-1 и i*N от i действительно не зависит, но для того чтобы это понять нужна система символьной алгебры, которой в моделсиме нет.

А в варианте var[i*N +: N] ширина записано явно - N, которая константа, и легко видно что она не зависит от переменных.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...