Jump to content
    

передача параметров в 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

 

Share this post


Link to post
Share on other sites

Можно использовать `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
);

Share this post


Link to post
Share on other sites

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

 

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;

Edited by Swup

Share this post


Link to post
Share on other sites

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

 

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

 

defparam    shift_reg_instance.const1 = new_parameter;

 

Share this post


Link to post
Share on other sites

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

package definitions;
  parameter cons1 = 8;
endpackage

...
import definitions::cons1;

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

А если сделать .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 --это ругать на файл с параметром.

 

Share this post


Link to post
Share on other sites

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

модуль:

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])
	) ;

Share this post


Link to post
Share on other sites

чего-то не получется. Задаю файл с параметром и пытаюсь его `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 директива должна быть в теле модуля например перед декларацией портов.

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Внутри тела:

module ();

parameter xxx = 0;

parameter yyy = 0;

endmodule

 

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

aaa #(new_parameter) bbb();

 

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

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...