Jump to content
    

в квартусе собираю.

тогда зачем вы вообще связались с передачей по ссылке ? пользуйте inout и будет вам счастье :)

Share this post


Link to post
Share on other sites

а что, можно для структуры написать вместо ref inout? Как он это поймет?

А в чем проблема? структура не динамический объект. По факту это logic/reg с доступом к битам не по индексу, а по символьному имени поля :)

Share this post


Link to post
Share on other sites

Еще вопрос.

 

Нужно вставить много памятей ончип, с разными параметрами. Пишу:

 

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

Получается, нельзя нагенерить много параметризируемых модулей?

Share this post


Link to post
Share on other sites

Приветствую!

 

Надо вот так

 

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.

 

Share this post


Link to post
Share on other sites

Можно задать параметры через #(). И функция 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])

        );

Share this post


Link to post
Share on other sites

Спасибо, ща попоробу.

А функция 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].

 

Share this post


Link to post
Share on other sites

Это вроде будет неупаковнный массив.

Попробую, но мне не понятно, откуда берется ошибка вообще?

 

Когда вручную добавляют несколько памятей, и подключаю к ним q[2], q[3] и т.д., ошибок нет, и работает все правильно.

 

И с пакованым и неупакованным массивом ведет себя одинаков. В чем еще проблема может быть?

Share this post


Link to post
Share on other sites

Думаю, Ваш код:

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 by doom13

Share this post


Link to post
Share on other sites

однако все равно хрень творится с передачей параметров модулю памяти.

 

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 бит. Чё за хрень?

Share this post


Link to post
Share on other sites

однако все равно хрень творится с передачей параметров модулю памяти.

 

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 бит. Чё за хрень?

выложите весь код

Share this post


Link to post
Share on other sites

Да это тупняк был. Пырился не в те строчки иерархии. Все нормально работает.

Первый раз попробовал все сделать 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. Почему так, мне непонятно.

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...