torik 0 April 23, 2014 Posted April 23, 2014 · Report post в квартусе собираю. ща попробую все исправить. Quote Share this post Link to post Share on other sites More sharing options...
des00 26 April 23, 2014 Posted April 23, 2014 · Report post в квартусе собираю. тогда зачем вы вообще связались с передачей по ссылке ? пользуйте inout и будет вам счастье :) Quote Share this post Link to post Share on other sites More sharing options...
torik 0 April 23, 2014 Posted April 23, 2014 · Report post а что, можно для структуры написать вместо ref inout? Как он это поймет? Quote Share this post Link to post Share on other sites More sharing options...
des00 26 April 23, 2014 Posted April 23, 2014 · Report post а что, можно для структуры написать вместо ref inout? Как он это поймет? А в чем проблема? структура не динамический объект. По факту это logic/reg с доступом к битам не по индексу, а по символьному имени поля :) Quote Share this post Link to post Share on other sites More sharing options...
torik 0 April 25, 2014 Posted April 25, 2014 · Report post Еще вопрос. Нужно вставить много памятей ончип, с разными параметрами. Пишу: generate for (i = 0; i < OBJ_NUM; i = i + 1) begin : mem_create obj_mem_nsci mem_s[i] ( .clk (clk), //wr .wr (s[i].wr), .wr_addr (avs_slave_address[14:0] + s[i].wr_saddr), .data (avs_slave_writedata), //rd .rd_addr (s[i].rd_addr), .q (q[i]) ); defparam mem_s[i].ADDR_W = log2((s_w[i] * s_h[i] * s_n[i])), mem_s[i].NUM_WODRS = (s_w[i] * s_h[i] * s_n[i]); end endgenerate obj_mem_nsci - это модуль, в котором объявлена онип память. Квартус выдает ошибку: Error (10244): Verilog Defparam Statement error at obj_nsci.sv(120): Quartus II Integrated Synthesis cannot resolve defparam identifier "mem_s[0].ADDR_W" to a parameter on a specific instance in the current module Получается, нельзя нагенерить много параметризируемых модулей? Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 58 April 25, 2014 Posted April 25, 2014 · Report post Приветствую! Надо вот так generate for (i = 0; i < OBJ_NUM; i = i + 1) begin : mem_create obj_mem_nsci #( .ADDR_W(log2( (s_w[i] * s_h[i] * s_n[i])) ), .NUM_WODRS( (s_w[i] * s_h[i] * s_n[i]) ) ) mem_s_inst ( .clk (clk), //wr .wr (s[i].wr), .wr_addr (avs_slave_address[14:0] + s[i].wr_saddr), .data (avs_slave_writedata), //rd .rd_addr (s[i].rd_addr), .q (q[i]) ); end endgenerate Удачи! Rob. Quote Share this post Link to post Share on other sites More sharing options...
negiin 0 April 25, 2014 Posted April 25, 2014 · Report post Можно задать параметры через #(). И функция log2 называется $clog2. obj_mem_nsci #( .ADDR_W ($clog2((s_w[i] * s_h[i] * s_n[i]))), .NUM_WODRS (s_w[i] * s_h[i] * s_n[i]) )mem_s[i] ( .clk (clk), //wr .wr (s[i].wr), .wr_addr (avs_slave_address[14:0] + s[i].wr_saddr), .data (avs_slave_writedata), //rd .rd_addr (s[i].rd_addr), .q (q[i]) ); Quote Share this post Link to post Share on other sites More sharing options...
torik 0 April 25, 2014 Posted April 25, 2014 · Report post Спасибо, ща попоробу. А функция log2 у меня определена своя. Вроде бы передача параметров через #() проканала, но вылезла следующая ошибка: Error (12014): Net "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|q[2][1]", which fans out to "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|s[2].q[1]", cannot be assigned more than one value Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[2].mem_s[1]|q[1]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[2].mem_s[0]|q[1]" Error (12014): Net "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|q[2][0]", which fans out to "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|s[2].q[0]", cannot be assigned more than one value Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[2].mem_s[1]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[2].mem_s[0]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[2].mem_s[1]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[2].mem_s[0]|q[0]" Error (12014): Net "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|q[3][0]", which fans out to "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|s[3].q[0]", cannot be assigned more than one value Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[3].mem_s[2]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[3].mem_s[1]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[3].mem_s[0]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[3].mem_s[2]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[3].mem_s[1]|q[0]" Error (12015): Net is fed by "qsys1:q1|mixer_nsci:mixer_nsci_0|obj_nsci:obj_nsci_inst|obj_mem_nsci:mem_create[3].mem_s[0]|q[0]" Чего ему надо, не вижу ошибки. Массив q объявлен так: wire [0:(OBJ_NUM-1)] [1:0] q; применяем его так: always @(posedge clk) begin for (int i = 0; i < OBJ_NUM; i = i + 1) s[i].q <= q[i]; end шина данных памяти также [1:0]. Quote Share this post Link to post Share on other sites More sharing options...
negiin 0 April 25, 2014 Posted April 25, 2014 · Report post Может так объявить? wire [1:0] q [0:(OBJ_NUM-1)]; Quote Share this post Link to post Share on other sites More sharing options...
torik 0 April 25, 2014 Posted April 25, 2014 · Report post Это вроде будет неупаковнный массив. Попробую, но мне не понятно, откуда берется ошибка вообще? Когда вручную добавляют несколько памятей, и подключаю к ним q[2], q[3] и т.д., ошибок нет, и работает все правильно. И с пакованым и неупакованным массивом ведет себя одинаков. В чем еще проблема может быть? Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 April 25, 2014 Posted April 25, 2014 (edited) · Report post Думаю, Ваш код: generate for (i = 0; i < OBJ_NUM; i = i + 1) begin : mem_create obj_mem_nsci #( .ADDR_W(log2( (s_w[i] * s_h[i] * s_n[i])) ), .NUM_WODRS( (s_w[i] * s_h[i] * s_n[i]) )) mem_s[i] ( .clk (clk), //wr .wr (s[i].wr), .wr_addr (avs_slave_address[14:0] + s[i].wr_saddr), .data (avs_slave_writedata), //rd .rd_addr (s[i].rd_addr), .q (q[i]) ); defparam mem_s[i].ADDR_W = log2((s_w[i] * s_h[i] * s_n[i])), mem_s[i].NUM_WODRS = (s_w[i] * s_h[i] * s_n[i]); end endgenerate , а надо как в примере RobFPGA, для mem_s убрать индекс i, синтезатор его сам добавит при синтезе схемы. Edited April 25, 2014 by doom13 Quote Share this post Link to post Share on other sites More sharing options...
torik 0 April 28, 2014 Posted April 28, 2014 · Report post Да, насчет mem_s вы правы... Quote Share this post Link to post Share on other sites More sharing options...
torik 0 April 28, 2014 Posted April 28, 2014 · Report post однако все равно хрень творится с передачей параметров модулю памяти. generate for (i = 1; i < OBJ_NUM; i = i + 1) begin : mem_create localparam [31:0] ADDR_WW = 14;//log2(s_w[i] * s_h[i] * s_n[i]); localparam [31:0] NUM_WODRSS = 9075;//(s_w[i] * s_h[i] * s_n[i]); obj_mem_nsci // #( // .ADDR_W(ADDR_WW), // .NUM_WODRS(NUM_WODRSS) // ) mem_s ( .clk (clk), //wr .wr (s[i].wr), .wr_addr (avs_slave_address[14:0] + s[i].wr_saddr), .data (avs_slave_writedata), //rd .rd_addr (s[i].rd_addr), .q (mem_qq[i]) ); end endgenerate Даже так получается три памяти 18150, 9075 и 256 бит. Чё за хрень? Quote Share this post Link to post Share on other sites More sharing options...
des00 26 April 28, 2014 Posted April 28, 2014 · Report post однако все равно хрень творится с передачей параметров модулю памяти. generate for (i = 1; i < OBJ_NUM; i = i + 1) begin : mem_create localparam [31:0] ADDR_WW = 14;//log2(s_w[i] * s_h[i] * s_n[i]); localparam [31:0] NUM_WODRSS = 9075;//(s_w[i] * s_h[i] * s_n[i]); obj_mem_nsci // #( // .ADDR_W(ADDR_WW), // .NUM_WODRS(NUM_WODRSS) // ) mem_s ( .clk (clk), //wr .wr (s[i].wr), .wr_addr (avs_slave_address[14:0] + s[i].wr_saddr), .data (avs_slave_writedata), //rd .rd_addr (s[i].rd_addr), .q (mem_qq[i]) ); end endgenerate Даже так получается три памяти 18150, 9075 и 256 бит. Чё за хрень? выложите весь код Quote Share this post Link to post Share on other sites More sharing options...
torik 0 May 13, 2014 Posted May 13, 2014 · Report post Да это тупняк был. Пырился не в те строчки иерархии. Все нормально работает. Первый раз попробовал все сделать task-ами и generate-ами. В целом удобно и даже необходимо иногда. Но иногда не работает и хрен поймешь почему, тонкости, которые не заметишь сразу. Например: task automatic s_obj_read ( ref s_obj s, input wr, input [(X_W - 1) : 0] X, input [(Y_W - 1) : 0] Y ); begin if (wr) begin //сброс адресов if ((X == 0) && (Y == 0)) begin s.rd_addr = s.rd_saddr; end else //изменение адреса и установка сигнала valid, когда координаты совпадают с координатами объекта if ((X >= (s.X - 1)) && (X < (s.X + s.w - 1)) && (Y >= (s.Y)) && (Y < (s.Y + s.h))) begin s.rd_addr = s.rd_addr + 1; s.valid[5:0] = {s.valid[4:0], 1'b1}; end else s.valid[5:0] = {s.valid[4:0], 1'b0}; end else s.valid[5:0] = {s.valid[4:0], 1'b0}; end endtask /* Процедура прорегистривания выхода памяти * */ task automatic s_obj_read_reg ( inout s_obj s ); begin //регистрим данные if (s.valid[1] && s.on) s.q_d = s.q; else s.q_d = 2'b10; end endtask если содержимое второй задачи запихать в первую, то работает некорректно, словно компилятор оптимизировал valid. Почему так, мне непонятно. Quote Share this post Link to post Share on other sites More sharing options...