synthetic-xst в xillinx получается долго

Я новичок в verilog и xilinx, и я пишу четырехпортовую оперативную память в verilog,

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

Я не знаю, в чем проблема и что мне делать? вот мой собственный код..

module Dram(CLKM,WEA,WEB,WEC,WED,ENA,ENB,ENC,END,DIA,DIB,DIC,DID,ADDRA,ADDRB,ADDRC,ADDRD,DOA,DOB,DOC,DOD);
input WEA,WEB,WEC,WED,ENA,ENB,ENC,END;
input [17:0]DIA,DIB,DIC,DID;
input [9:0]ADDRA,ADDRB,ADDRC,ADDRD;
input CLKM;
output reg [17:0] DOA,DOB,DOC,DOD;
reg state_reg,state_next;
reg [17:0]ram[1023:0];
always@(posedge CLKM)
begin
    state_reg=state_next;
end///edn for always
always@(negedge  CLKM)
begin
    case(state_reg)
        1'b0:
        begin
            if(ENA)
            begin
                if(WEA)
                    ram[ADDRA]<=DIA;
                DOA<=ram[ADDRA];
            end//////for enA
            if(ENB)
            begin
                if(WEB)
                    ram[ADDRB]<=DIB;
                DOB<=ram[ADDRB];
            end////for enB
            state_next=1'b1;
        end////for 1'b0
        1'b1:
        begin
            if(ENC)
            begin
                if(WEC)
                    ram[ADDRC]<=DIC;
                DOC<=ram[ADDRC];
            end
            if(END)
            begin
                if(WED==1'b1)
                    ram[ADDRD]<=DID;
                DOD<=ram[ADDRD];
            end
            state_next=1'b0;
        end///end for 1'b1
    endcase
end//end for always

endmodule

Я думал, что это простой код, и у меня мало времени, но теперь я не могу синтезировать свой код? в чем проблема? плиз помогите!!! Благодарность


person sarah sh    schedule 31.12.2013    source источник
comment
Хорошей практикой является красивое форматирование кода, чтобы его было легче читать. Использование sp.ace для отступа вместо табуляции.   -  person Morgan    schedule 31.12.2013


Ответы (2)


Проблема заключается в том, как вы получаете доступ к массиву оперативной памяти. Вы делаете это внутри комбинационного блока. Это заставляет XST создавать вашу RAM, используя распределенную RAM, а не блочную RAM, и создает множество мультиплексоров для покрытия всех 1024 возможных комбинаций для ADDRA/ADDRB/ADDRC/ADDRD сигналов. Вот почему вы испытываете длительное время синтеза.

Переосмыслите свою логику, чтобы такой код, как ram[ADDR] <= value или value <= ram[ADDR], всегда срабатывал внутри часов.


После вашего отредактированного кода: я предлагаю отделить четырехпортовую логику ОЗУ от самой логики ОЗУ. Вы передаете стандартный модуль ОЗУ с одним портом, а затем, используя FSM, заставляете его действовать так, как если бы у него было много портов, не так ли? Ваша однопортовая оперативная память и источник ваших головных болей могут быть описаны следующим образом:

module spram (input wire clk,
  input wire en,
  input wire we,
  input wire [9:0] addr,
  input wire [17:0] din,
  output reg [17:0] dout
  );

  reg [17:0] ram[0:1023];

  always @(negedge clk) begin
    if (en) begin
      if (we) begin
        ram[addr] <= din;
      end
      dout <= ram[addr];
    end
  end
endmodule

Такое описание памяти поможет XST определить ее как блочное устройство ОЗУ, как указано в отчете о расширенном синтезе:

Synthesizing (advanced) Unit <spram>.
INFO:Xst:3040 - The RAM <Mram_ram> will be implemented as a BLOCK RAM, absorbing the following register(s): <dout>
    -----------------------------------------------------------------------
    | ram_type           | Block                               |          |
    -----------------------------------------------------------------------
    | Port A                                                              |
    |     aspect ratio   | 1024-word x 18-bit                  |          |
    |     mode           | read-first                          |          |
    |     clkA           | connected to signal <clk>           | fall     |
    |     enA            | connected to signal <en>            | high     |
    |     weA            | connected to signal <we>            | high     |
    |     addrA          | connected to signal <addr>          |          |
    |     diA            | connected to signal <din>           |          |
    |     doA            | connected to signal <dout>          |          |
    -----------------------------------------------------------------------
    | optimization       | speed                               |          |
    -----------------------------------------------------------------------
Unit <spram> synthesized (advanced).

Затем вы можете создать экземпляр этой оперативной памяти в своем дизайне с четырьмя портами и мультиплексировать сигналы в зависимости от того, в каком состоянии вы находитесь. Что-то вроде этого:

module qpram (input wire clk,
  input wire [3:0] en,
  input wire [3:0] we,
  input wire [9:0] addra,
  input wire [9:0] addrb,
  input wire [9:0] addrc,
  input wire [9:0] addrd,
  input wire [17:0] dina,
  input wire [17:0] dinb,
  input wire [17:0] dinc,
  input wire [17:0] dind,
  output reg [17:0] douta,
  output reg [17:0] doutb,
  output reg [17:0] doutc,
  output reg [17:0] doutd
  );

  reg [1:0] port = 2'b00; /* indicates which port is active */
  always @(negedge clk) begin
    port <= port + 1;
  end

  /* instantiate single port RAM */
  reg enable,write;
  reg [17:0] din;
  wire [17:0] dout;
  reg [9:0] addr;
  spram myram (clk,enable,write,addr,din,dout);

  /* multiplexers to assign right inputs to RAM
  depending on which port we are in */
  always @* begin
    case (port)
      2'b00 : begin
                addr = addra;
                write = we[0];
                enable = en[0];
                din = dina;
              end
      2'b01 : begin
                addr = addrb;
                write = we[1];
                enable = en[1];
                din = dinb;
              end
      2'b10 : begin
                addr = addrc;
                write = we[2];
                enable = en[2];
                din = dinc;
              end
      2'b11 : begin
                addr = addrd;
                write = we[3];
                enable = en[3];
                din = dinc;
              end
    endcase
  end

  /* data out is available at the end of each clock cycle */
  always @(negedge clk) begin
    case (port)
      2'b00 : douta <= dout;
      2'b01 : doutb <= dout;
      2'b10 : doutc <= dout;
      2'b11 : doutd <= dout;
    endcase
  end
endmodule
person mcleod_ideafix    schedule 31.12.2013
comment
теперь я отредактировал свой код, вы можете посмотреть на него выше, и использовать оперативную память в часах всегда, как вы сказали, но это слишком долго для расширенного синтеза hdl !! что мне делать? - person sarah sh; 31.12.2013

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

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

person Tim    schedule 31.12.2013
comment
спасибо @Tim, да, я думаю, что проблема в состоянии, но что мне делать, мне это нужно, это необходимо для моего дизайна, я просто хотел реализовать машину FSM в своем дизайне, и я сделал это по состоянию. - person sarah sh; 31.12.2013
comment
Вы все еще можете использовать if(state) внутри тактового блока. Просто замените always@(state) на always@(negedge CLKM), и я думаю, это должно помочь. - person Tim; 31.12.2013
comment
Я сделал это, и теперь часть моего кода выглядит так, но это тоже требует времени, я думаю, что проблема снова в состоянии !!! выходное состояние регистра; рег [17:0]рам [1023:0]; всегда@(negedge CLKM) begin if(state==1'b0) state‹=1'b1; иначе если (состояние==1'b1) состояние‹=1'b0; if(state==1'b0) begin if(ENA) begin if(WEA) ram[ADDRA]‹=DIA; DOA‹=бам[АДДРА]; конец.........' извините за плохое письмо!!! - person sarah sh; 31.12.2013