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

возможность СИНТЕЗИРОВАТЬ структуру соединений с помощью generic interface port

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

 

казалось бы, что generic interface port как раз для этого и предназначено

поддерживает ли современные средства синтеза такую конструкцию?

 

делал ли кто-нибудь так? можете показать пример синтезируемого кода?

 

--------

 

сейчас приходится описывать в структуре соединений сигналы, которые могут использоваться любым типом модулей, что вызывает большой размер кода и трудность отладки описания соединений (как статических, так и коммутируемых)

 

у меня есть пример, довольно громоздский (могу выложить UPD : выложил, может кто-то осилит многа букав), чтобы как-то придать смысл, но пресижин валится с внутренней ошибкой (симулятор ок)

UPD: ну после некой возни с примером (и утраты части интересующих фич), пресижином начало синтезироваться, но выбрасывает всю начинку нафиг....

 

 

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

 

теоретический вопрос:

 

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

можно ли при описании модуля с generic interface портом указывать модпорт этого обобщенного интерфейса (ну то есть я создаю много интерфейсов, но в них есть обязательно modport master и modport slave) - или это строго запрещено стандартом?

 

 

=======================

если не лень посмотреть, и указать на ошибки:

 

typedef struct packed {
                       logic [7:0]        data;
                       logic                rd;
                       logic                wr;
                       } trans;
//-------------------------------------------------------------------------
interface test;
   logic [7:0]                                 data_in;
   logic                                        rd_req_in;
   logic                                        wr_req_in;
   logic [7:0]                                 out_data;
   logic                                        out_rd_ack;
   logic                                        out_wr_ack;
   modport master(output  data_in,rd_req_in,wr_req_in,
                  input out_data,out_rd_ack,out_wr_ack
                  );
   modport slave(input  data_in,rd_req_in,wr_req_in,
                 output out_data,out_rd_ack,out_wr_ack
                 );
endinterface

//-------------------------------------------------------------------------
module bi(interface mtr, slva, slvb, input logic clk);
   //it is desiriable:
   // implement for abstract assignmrnt
   // modport usage for data protection

   trans i,o;

   //non abstract funcionality (probably in sub-modules)
   //from master(s) to slave(s)
   //a
   always_ff @(posedge clk)
     begin
        i.data<=mtr.data_in;
        i.rd<=mtr.rd_req_in;
        i.wr<=mtr.wr_req_in;
     end
   assign slva.data_in=i.data;
   assign slva.rd_req_in=i.rd;
   assign slva.wr_req_in=i.wr;
   //b
   assign slvb.data_in=i.data;
   assign slvb.rd_req_in=i.rd;
   assign slvb.wr_req_in=i.wr;
   //from slaves to master
   always_ff @(posedge clk)
     begin
        o.data<=slva.out_data|slvb.out_data;
        o.rd<=slva.out_rd_ack|slvb.out_rd_ack;
        o.wr<=slva.out_wr_ack|slvb.out_wr_ack;
     end
   assign mtr.out_data=o.data;
   assign mtr.out_rd_ack=o.rd;
   assign mtr.out_wr_ack=o.wr;
endmodule // node

//-------------------------------------------------------------------------
//not good for precision
/*
module con_lr(test.master in, test.slave out);
//abstraction resovled here
   assign in.out_data=out.out_data;
   assign in.out_rd_ack=out.out_rd_ack;
   assign in.out_wr_ack=out.out_wr_ack;
   assign out.data_in=in.data_in;
   assign out.rd_req_in=in.rd_req_in;
   assign out.wr_req_in=in.wr_req_in;
endmodule
module con_rl(test.slave in, test.master out);
   //abstraction resovled here
   assign in.data_in=out.data_in;
   assign in.rd_req_in=out.rd_req_in;
   assign in.wr_req_in=out.wr_req_in;
   assign out.out_data=in.out_data;
   assign out.out_rd_ack=in.out_rd_ack;
   assign out.out_wr_ack=in.out_wr_ack;
endmodule
*/
//-------------------------------------------------------------------------
//abstract connections here
module tree
  #(parameter int NLOG=3)
    (
     test.master root_node,
     test.slave cherry[2**NLOG],
     //not good for precision
     /*
     interface root_node,
     interface cherry[2**NLOG],
     */
     input logic clk
     );
   //root is slave modport
   //cherry are master modports

   //it is desiriable:
   // implement for abstract assignmrnt
   // modport usage for data protection

   test i[2**(NLOG+1):1]();

   genvar  stage, node, c;
   generate for(stage=1; stage<=NLOG; stage++)
     begin : stages
        for(node=0; node<2**(stage-1); node++)
          begin : nodes
             bi nd(i[2**(stage-1)+node].master, i[2**stage+node].slave, i[2**stage+node+2**(stage-1)].slave, clk);
          end
     end
   endgenerate

   //it is desiriable:
   //incapsulate following assignments into iface
   //root
   assign root_node.out_data=i[1].out_data;
   assign root_node.out_rd_ack=i[1].out_rd_ack;
   assign root_node.out_wr_ack=i[1].out_wr_ack;
   assign i[1].data_in=root_node.data_in;
   assign i[1].rd_req_in=root_node.rd_req_in;
   assign i[1].wr_req_in=root_node.wr_req_in;

   //cherries
   generate for(c=0; c<2**NLOG; c++)
     begin : out_assign
        assign cherry[c].data_in=i[2**NLOG+c].data_in;
        assign cherry[c].rd_req_in=i[2**NLOG+c].rd_req_in;
        assign cherry[c].wr_req_in=i[2**NLOG+c].wr_req_in;
        assign i[2**NLOG+c].out_data=cherry[c].out_data;
        assign i[2**NLOG+c].out_rd_ack=cherry[c].out_rd_ack;
        assign i[2**NLOG+c].out_wr_ack=cherry[c].out_wr_ack;
     end
   endgenerate

   /*
   //it is desiriable:
   //incapsulated
   //root
   con_lr r(root_node, i[1]);

   //cherries
   generate for(c=0; c<2**NLOG; c++)
     begin : out_assign
        con_rl o(cherry[c],i[2**NLOG+c]);
     end
   endgenerate

   */

endmodule //

//-------------------------------------------------------------------------
module tree_wo_if
  #(
    parameter int NLOG=3
    )
    (
     input trans rt_in,
     output trans rt_out,
     input trans [2**NLOG-1:0] cr_in,
     output trans [2**NLOG-1:0] cr_out,
     input logic clk
     );

   genvar   c;

   test rt();
   test ch[2**NLOG]();

   tree tr(rt, ch, clk);

   assign    rt.data_in=rt_in.data;
   assign    rt.rd_req_in=rt_in.rd;
   assign    rt.wr_req_in=rt_in.wr;
   assign    rt_out.data=rt.out_data;
   assign    rt_out.rd=rt.out_rd_ack;
   assign    rt_out.wr=rt.out_wr_ack;

   generate for(c=0; c<2**NLOG; c++)
     begin : out_assign
        assign cr_out[c].data=ch[c].data_in;
        assign cr_out[c].rd=ch[c].rd_req_in;
        assign cr_out[c].wr=ch[c].wr_req_in;
        assign ch[c].out_data=cr_in[c].data;
        assign ch[c].out_rd_ack=cr_in[c].rd;
        assign ch[c].out_wr_ack=cr_in[c].wr;
     end
   endgenerate

endmodule

//--simulation

/*
module node_dummy
  (
   input trans i,
   output trans o,
   input logic en,
   input logic clk
   );

   always_ff @(posedge clk)
     if(en)
       begin
          o.data<=i.data;
          o.rd<=i.rd;
          o.wr<=i.wr;
       end
     else
       begin
          o.data<=0;
          o.rd<=0;
          o.wr<=0;
       end
endmodule // node_dummy

/*
module top_test;

   parameter int NLOG=3;

   trans in_r=0, out_r;
   trans [2**NLOG-1:0]  in_c, out_c;

   logic     clk=0;
   logic [2**NLOG-1:0] en=0;

   tree_wo_if dut(in_r, out_r, in_c, out_c, clk);

   generate  for(genvar i=0; i<2**NLOG; i++)
     begin : out_dummy
        node_dummy io(out_c[i], in_c[i], en[i], clk);
     end
   endgenerate

   always #5 clk=~clk;

   initial
     begin
        @(posedge clk);
        in_r.data=123;
        in_r.wr=1;
        @(posedge clk);
        in_r.data=222;
        in_r.wr=0;
        in_r.rd=1;
        en=1;
        @(posedge clk);
        in_r.data=0;
        in_r.wr=0;
        in_r.rd=0;
        en=2;
        @(posedge clk);
        in_r.data=123;
        in_r.wr=1;
        @(posedge clk);
        in_r.data=222;
        in_r.wr=0;
        in_r.rd=1;
        en=1;
        @(posedge clk);
        in_r.data=0;
        in_r.wr=0;
        in_r.rd=0;
        en=0;
        @(posedge clk);
        in_r.data=0;
        in_r.wr=0;
        in_r.rd=0;
        @(posedge clk);
        in_r.data=0;
        in_r.wr=0;
        in_r.rd=0;

        repeat (16) @(posedge clk);

        $stop;
     end // initial begin

endmodule
*/

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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