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

передача параметров в Verilog

Здравствуйте. Сразу прошу прощения за глупый вопрос, новичёк...

Как мне передать константы другим модулям (другие файлы) в проекте?

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

//файл с константами
module constant
    #(parameter cons1=8);
endmodule

 

//файл куда нужно передать константу cons1

module shift_reg(clk,serial_data,parallel_data);
    input clk;
    input serial_data; 
    
    output reg [7:0]parallel_data;
    always @ (posedge clk)
        parallel_data = {serial_data, parallel_data[[b]cons1[/b]-1:1]};        
endmodule

 

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


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

Можно использовать `define, а файл с ними подключать с помощью `include.

 

`define MEMMAX 14            // 2^14 words (16K)

 

`include "xxx_Defs.sv"
module Memory_m (
  input bit        clkf,        //!< fast clock
  input bit        clkm,        //!< main clock
  ...
  input bit [`MEMMAX-1:9] memszen,    //!< memory size
);

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


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

Можно при вызове модуля передавать параметры

http://www.asic-world.com/verilog/para_modules1.html

последний пример

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


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

модуль описываете так (это конечно не единственный вариант):

 

module shift_reg
#( parameter const1= 8)  //параметр по умолчанию
(    input clk,
     input serial_data, 
    
    output reg [7:0]parallel_data );

    always @ (posedge clk)
        parallel_data = {serial_data, parallel_data[cons1-1:1]};        
endmodule

 

При создании копии модуля объявление такое:

shift_reg      shift_reg_instance 
(  .clk( ),     // в скобках wire которые связывают модули
   .serial_data(),
   .parallel_data () );
defparam    shift_reg_instance.const1 = new_parameter;

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

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


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

небольшое замечание:

 

defparam далеко не каждый синтезатор уважает

 

defparam    shift_reg_instance.const1 = new_parameter;

 

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


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

Пару слов про SV

package definitions;
  parameter cons1 = 8;
endpackage

...
import definitions::cons1;

always @ (posedge clk)
        parallel_data = {serial_data, parallel_data[cons1-1:1]};

 

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


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

Можно использовать `define, а файл с ними подключать с помощью `include.

Я бы к `define прибегал только в крайнем случае т.к он глобальный.

А если сделать .v (include) фаил с параметрами то его можно `include в тело модуля где надо.

Но самый распостраненный способ это передавать нужные парамеры во время instantiation.

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


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

А если сделать .v (include) фаил с параметрами то его можно `include в тело модуля где надо.

чего-то не получется. Задаю файл с параметром и пытаюсь его `include в другой файл соответственно.

Quartus 8.0 пишет: если поставить `include в самом начале файла (перед module ): ...нельзя декларировать больше 1-го раза

если в тексте то говарит что то вроде этого : Error (10170): Verilog HDL syntax error at cons.v(3) near text "module"; expecting ";", or ":", or "@", or "end", or an identifier ("module" is a reserved keyword ), or a system task, or "{", or a sequential statement --это ругать на файл с параметром.

 

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


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

Проще и правильнее (ИМХО), делать так:

модуль:

module ETH1000MDIO
#(
parameter [11:0] CLKDIV = 12'd800,
parameter [4:0] PHY_ADDR = 5'b00000
)
(
input clk,
input reset,
input [7:0] data_in,
input wr_mdio_ctrl,
input wr_reg_address,
input wr_data_l,
input wr_data_h,
output [7:0] data_out_l,
output [7:0] data_out_h,
output ready,
output reg set_1000,
output mdc,
inout mdio
) ;

Вставка в проект:

ETH1000MDIO	#(
	.CLKDIV (12'd500),
	.PHY_ADDR (5'b00000)
	)

	SYS_ETH1000MDIO (
	.clk (clk_cpu),
	.reset (reset_mac),
	.data_in (data_out),
	.wr_mdio_ctrl (IOW_MDIO_CTRL[i]),
	.wr_reg_address (IOW_MDIO_REG_ADDR[i]),
	.wr_data_l (IOW_MDIO_DATAL[i]),
	.wr_data_h (IOW_MDIO_DATAH[i]),
	.data_out_l (IN_MDIO_DATAL[i]),
	.data_out_h (IN_MDIO_DATAH[i]),
	.ready (STATUS_MAC[i][5]),
	.set_1000 (),
	.mdc (enet_mdc[i]),
	.mdio (enet_mdio[i])
	) ;

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


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

чего-то не получется. Задаю файл с параметром и пытаюсь его `include в другой файл соответственно.

Quartus 8.0 пишет: если поставить `include в самом начале файла (перед module ): ...нельзя декларировать больше 1-го раза

если в тексте то говарит что то вроде этого : Error (10170): Verilog HDL syntax error at cons.v(3) near text "module"; expecting ";", or ":", or "@", or "end", or an identifier ("module" is a reserved keyword ), or a system task, or "{", or a sequential statement --это ругать на файл с параметром.

include фаил должен содержать только набор типа

 

parameter XXX=<value>;

parameter YYY=<value>;

 

`include директива должна быть в теле модуля например перед декларацией портов.

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


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

чего-то не получется. Задаю файл с параметром и пытаюсь его `include в другой файл соответственно.

Quartus 8.0 пишет: если поставить `include в самом начале файла (перед module ): ...нельзя декларировать больше 1-го раза

Не совсем понял, что там у вас... но, если файл подключается в нескольких файлах, можно применить известный прием. В файле, который подключаем, пишем следующие строчки, и тогда в проекте он будет подключен один раз.

`ifndef DEFS
`define DEFS
...
// Здесь ваши типы данных, константы и т.п.
...
`endif

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


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

`ifndef DEFS
`define DEFS
...
// Здесь ваши типы данных, константы и т.п.
...
`endif

Мне кажется в этом случае фаил будет включен только один раз.

Ето ОК если внутри фаила `define (глобальные переменнные), но а если внутри параметры то это не подходит т.к параметры будут вклуючены в один фаил -модуль (певый в порядке компиляции).

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


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

Внутри тела:

module ();

parameter xxx = 0;

parameter yyy = 0;

endmodule

 

Снаружи при вызове модуля:

aaa #(new_parameter) bbb();

 

При этом только первый параметер будет изменен. Можно передать значение параметра из топового модуля, но необходимо спускаться по иерархии.

 

 

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


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

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

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

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

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

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

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

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

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

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