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

что-то Синплифай последнее время стал раздражать

Если посмотреть стандарт IEEE1394-1995, Annex A.2, то можно увидеть это:

output_declaration ::= output[range] list_of_port_identifiers;

У Вас есть объявления вида output reg, что допускается в Verilog 2001. Если хотите писать в стиле 95, то объявите просто output, и reg с таким же именем.

я не знаю наизусть стандарт, поэтому могу ошибаться. по моему разумению дело обстоит так:

в 95ом обЪявление модуля не может содержать ничего кроме списка идентификаторов портов, а декларация портов находиться внутри тела модуля, т.е.:

module (a,b,c,d,e);//идентификаторы 
input a; //декларации портов 
output reg b;
input c;
output d;
output [7:0] e;
wire c;
reg d;
reg [7:0]e;//регистров по желанию совпадающих с названием портов 
...
endmodule

в 2001 декларации можно выносить в шапку:

module (
input a,
output reg b,
input c,
output reg d,
output reg [7:0] e);
...
endmodule

фишка в том что я привык писать параметризируемые модули!

и если ширина порта определяется параметром, то приходится использовать стиль 95 - потому как конструкция типа такой не прокатит из-за области видимости параметров :

//v2001
module (
input [data_width-1:0] a,
output reg [data_width-1:0] b
);
parameter data_width=8;
...
endmodule

приходится писать так :

//v'95
module (a, b  );

parameter data_width=8;

input [data_width-1:0] a;
output reg [data_width-1:0] b;
...
endmodule

загвоздка здесь была в том что параметр рассчитывается в функции описаной по стилю v2001:

module (a, b   );
`include "power.v"
parameter data_width=some_function(some_other_parameter);

input [data_width-1:0] a;
output reg [data_width-1:0] b;
...
endmodule

файл power.v:

some_function (input integer some_other_parameter);
...
endfunction

все остальные компиляторы едят это с удовольствием, а вот любимый синплифай воротит морду - т.е. нужно переписывать заголовки функций чтобы ему понравится - как подругому бороться с этим мне пока неизвестно

вот такая фишкa

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


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

Это как это "инициализированных при декларации регистров в Verilog"? Что, уже можно написать:

 

reg a = 1;

 

и это будет синтезабельная конструкция?

 

Да это с версии 8.2.1 синтезабельная конструкция:

Initial values specified in the RTL for sequential elements and memories can

be mapped to startup values on the FPGA. Xilinx devices support power on

startup values for registers and memories. Initial values specified in Verilog

are converted to a technology independent attribute called syn_init_val by the

compiler. The attribute is then carried on the inferred logic, which is passed

on to the technology mapper to generate a startup value for the mapped

sequential element.

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


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

По поводу лекарства:

Если стоит 8.2 то она его просто патчит, а устанавливать заново пока не пытался.

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


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

если вы хотите в 2001 стиле просто описать параметризированные порты, то это можно сделать так:

 

module  fifo_write #(
   parameter   DATA_WIDTH = 32, 
   parameter   ADDR_WIDTH = 3
   ) (
   input       clk, 
   input [ADDR_WIDTH-1:0]  addr, 
   input [DATA_WIDTH-1:0]  data,
....
parameter    FIFO_DEPTH  = 1 << ADDR_WIDTH; 
reg [DATA_WIDTH-1:0] MEM_ARRAY [0:FIFO_DEPTH-1];

 

тогда переопределение параметров при вызове делается :

fifo_write #(16,4)
fifo_0 (core_clk, addr, data 

or 

fifo_write #(.DATA_WIDTH ( 16 ))
   fifo_0 (

 

Обратите внимание, что имя компонента стоит после параметров.

 

А вот с функцией - тут, похоже, уже не помочь ничем

Возможно, разнесение output и reg может помочь (это тоже 2001 стиль)

спасибо за интересный пример

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


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

если вы хотите в 2001 стиле просто описать параметризированные порты, то это можно сделать так:

 

module  fifo_write #(
   parameter   DATA_WIDTH = 32, 
   parameter   ADDR_WIDTH = 3
   ) (
   input       clk, 
   input [ADDR_WIDTH-1:0]  addr, 
   input [DATA_WIDTH-1:0]  data,
....
parameter    FIFO_DEPTH  = 1 << ADDR_WIDTH; 
reg [DATA_WIDTH-1:0] MEM_ARRAY [0:FIFO_DEPTH-1];

 

[/code]

 

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

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


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

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

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

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

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

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

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

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

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

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