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

нет ли, случайно, в Vivado 2021 каких-либо проблем с generate?

собственно конструкция, которая уже давно не вызывает (по-моему) проблем у синтеза

параметр k используется для декодирования блока, то есть сравнивается со старшими битами адреса внутри mem

---------------

при этом в нетлисте оказывается только 1 блок для к=0

может, конечно, какая-то фигня снаружи этого модуля оптимизирует "лишнее", но симуляция работает (много памятей внутри), в логе синтеза я пока не нашел цепочку оптимизации

только начал разбираться, но может есть какой-то известный глюк?

module mblock(
	   input wire 	       rst, uclk, aclk,

	   //wr side (direct to block)
	   input 	       wr_bus dat,
	   input 	       wr_bus ctl,

	   //rd side
	   input 	       rd_ctl uctl,
	   output logic [15:0] udata	   

		 );

   logic [MBLOCKS-1:0][15:0]   udout;

   logic [WMBLOCK-1:0] 	       ba_d;
   always @(posedge uclk) //store read block
     ba_d<=uctl.ba;

   assign udata=udout[ba_d];

   genvar k;
   generate for(k=0; k<MBLOCKS; k++) begin : mem_pool

      mem #(k) blk(
		   .udat(udout[k]),
		   .*);
   end
   endgenerate

endmodule

 

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


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

38 minutes ago, yes said:

logic [MBLOCKS-1:0][15:0] udout;

Если мне не изменяет память (могу ошибаться), то при аннотации типа:

genvar k;
generate for(k=0; k<MBLOCKS; k++) begin : mem_pool
	...
    udout[k]
	...
end
endgenerate

Индекс 'k' будет перечисляемым для диапазона [15:0], а не как хотелось [MBLOCKS-1:0], потому как индексация идёт от переменной влево для упакованых и вправо для неупакованных массивов.

А вообще попробуйте запись типа:

	csa #(
		.p_synch_rst	(1),
		.p_preload		(0),
		.p_int_res		(p_int_res * p_num_adders))
	carry_adder [ 1 : 0 ] (
		.i_clk			(i_clk),
		.i_nrst			(s_nrst),
		.i_csa_ce		({s_owerflow_0,i_en}),
		.o_overflow		({s_owerflow_1,s_owerflow_0}),
		.o_csa_count	({r_csa_1_cnt,r_csa_0_cnt}));

Без вских дженериков и прочего. Вивада поругается немного, но такая конструкция вполне допустима

 

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


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

11 minutes ago, Nick_K said:

Если мне не изменяет память (могу ошибаться), то при аннотации типа:


genvar k;
generate for(k=0; k<MBLOCKS; k++) begin : mem_pool
	...
    udout[k]
	...
end
endgenerate

Индекс 'k' будет перечисляемым для диапазона [15:0], а не как хотелось [MBLOCKS-1:0], потому как индексация идёт от переменной влево для упакованых и вправо для неупакованных массивов.

А вообще попробуйте запись типа:


	csa #(
		.p_synch_rst	(1),
		.p_preload		(0),
		.p_int_res		(p_int_res * p_num_adders))
	carry_adder [ 1 : 0 ] (
		.i_clk			(i_clk),
		.i_nrst			(s_nrst),
		.i_csa_ce		({s_owerflow_0,i_en}),
		.o_overflow		({s_owerflow_1,s_owerflow_0}),
		.o_csa_count	({r_csa_1_cnt,r_csa_0_cnt}));

Без вских дженериков и прочего. Вивада поругается немного, но такая конструкция вполне допустима

 

спасибо, проверю (возьму одномерный массив). но по-моему индексы идут "по человечески upd как в С, наоборот было бы странно делать, по-моему" - вначале слева D[j][k] (bit [J][K] D;) - можно как D[j] размером в k или D размером в j*k

 

upd: движок съедает \[ i \] но и так, надеюсь понятно чего я хотел написать

upd2: да вроде ОК - с массивом (это я гугль спросил) - если unpacked массив packed массивов - то вначале перебираются unpacked индексы (в нормальном порядке - как в С), а затем packed (и опять как в С) 

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


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

то ли у меня был глюк, то ли виваде не нравится genvar k

собралось как-то так - дальше не буду разбираться

   genvar j;
   generate for(j=0; j<MBLOCKS; j=j+1) begin : mem_pool
    wire [15:0] udat;
    assign udout[j]=udat;
    
      mem #(j) blk(
		   .udat(udat),
		   .dat(dat),
		   .ctl(ctl),
		   .uctl(uctl),
		   .rst(rst),
		   .uclk(uclk),
		   .aclk(aclk)
		  );
   end
   endgenerate

 

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


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

3 hours ago, yes said:

upd2: да вроде ОК - с массивом (это я гугль спросил) - если unpacked массив packed массивов - то вначале перебираются unpacked индексы (в нормальном порядке - как в С), а затем packed (и опять как в С) 

Да, вполне возможно. Я просто помню, что наступал на эти грабли пару раз, считая не с той стороны. Вот видно не с той что нужно и запомнил.

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


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

А как определены параметры MBLOCKS и WMBLOCK?
Судя по коду, предполагается, что они должны быть связаны как MBLOCKS-1 = 2**WMBLOCK-1, иначе диапазон [MBLOCKS-1:0] будет не соответствовать возможным значениям ba_d и тогда возможно что какие-то блоки udout отвалятся

logic [MBLOCKS-1:0][15:0]   udout;

   logic [WMBLOCK-1:0] 	       ba_d;
  ...
   assign udata=udout[ba_d];

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


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

16 hours ago, Zwerg_nase said:

А как определены параметры MBLOCKS и WMBLOCK?
Судя по коду, предполагается, что они должны быть связаны как MBLOCKS-1 = 2**WMBLOCK-1, иначе диапазон [MBLOCKS-1:0] будет не соответствовать возможным значениям ba_d и тогда возможно что какие-то блоки udout отвалятся


logic [MBLOCKS-1:0][15:0]   udout;

   logic [WMBLOCK-1:0] 	       ba_d;
  ...
   assign udata=udout[ba_d];

да, так и определены, через import package

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


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

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

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

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

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

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

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

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

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

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