yes 7 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба собственно конструкция, которая уже давно не вызывает (по-моему) проблем у синтеза параметр 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба 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})); Без вских дженериков и прочего. Вивада поругается немного, но такая конструкция вполне допустима Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба 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 (и опять как в С) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба то ли у меня был глюк, то ли виваде не нравится 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба 3 hours ago, yes said: upd2: да вроде ОК - с массивом (это я гугль спросил) - если unpacked массив packed массивов - то вначале перебираются unpacked индексы (в нормальном порядке - как в С), а затем packed (и опять как в С) Да, вполне возможно. Я просто помню, что наступал на эти грабли пару раз, считая не с той стороны. Вот видно не с той что нужно и запомнил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 8 февраля, 2022 Опубликовано 8 февраля, 2022 · Жалоба А как определены параметры 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]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 9 февраля, 2022 Опубликовано 9 февраля, 2022 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться