можно ли синтезировать @ (posedge clk)? - PullRequest
0 голосов
/ 01 октября 2019

Можно ли синтезировать следующий код? В коде используется @posedge, не всегда @posedge. Это может быть синтезировано? Если да, то какие будут схемы?

Спасибо,

Брайан

  module state_machine(clk,reset,read,data_out);

  ......

  always @(reset or read)
    begin
    @(posedge clk)
    if(reset) p<=0;
    elseif(read)
    begin
     data_out<=ram_data[p];
    @(posedge clk)
   p<=p+1;
   end
 endmodule

Ответы [ 2 ]

0 голосов
/ 04 октября 2019
module state_machine(clk,reset,read,data_out);

  ......

  always @(reset or read)
    begin
    @(posedge clk)  // No @ allowed inside another @
    if(reset) p<=0; // reset data_out also .
    elseif(read)
    begin
     data_out<=ram_data[p];
    @(posedge clk)  // No @ inside another @
   p<=p+1;
   end
 endmodule

``````````````

Not clear about the intend here but the closest i could write to the code was...
This will keep on increment the address and output its content everytime there is a read pulse. 
Assuming memory already has data from a different logic.(write to memory)
Assuming p width is takes care of the depth of the memory.

```````````````
module state_machine(clk,reset,read,data_out);

  ......

  always @(posedge clk or negedge reset)
    begin
    if(~reset) 
    begin
      p<=0;
      data_out<=0;
    else begin
      if(read)
       begin
         data_out<=ram_data[p];
         p<=p+1;
       end
 endmodule

`````````````
0 голосов
/ 02 октября 2019

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

Выспросите, могу ли я быть более точным о том, что плохо или двусмысленно с тем, как дизайн в настоящее время закодирован? Конечно. Утверждение @ (поставлено clk);используется в строке, чтобы остановить выполнение текущего кода до тех пор, пока часы не перейдут с низкого уровня на высокий после выполнения предыдущих операторов. В симуляторе или с-программе это возможно;Вы бы приостановили процесс, который реализует этот блок всегда. Далее инструмент (как-то как) устроит так, что код больше не активирует его, когда происходит событие в исходном списке чувствительности "Always @ (read или rst)";но теперь возобновите процесс, когда наступят часы установленного события.

Для того, чтобы инструмент синтеза реализовал это, ему пришлось бы построить логику, которая иногда ищет чтение и первое, а другое время ищет изменение тактовой частоты от 0 до 1;и отслеживать, когда делать какую деятельность. Или, повторюсь, потребуется создать конечный автомат для реализации вашего стиля кодирования (который затем создает другой конечный автомат!). Хотя все возможно, компромисс был достигнут.

Первоначальные авторы инструментов синтеза встретились с оригинальными кодировщиками симуляторов Verilog и разработчиками логики и заключили сделку (IEEE Std 1364.1 - Синтез уровня передачи регистра Verilog) определить, какие конструкции было бы легко кодировать людям, эффективно выполнять на симуляторах и просто для инструментов синтеза - создавать логику, которая выполнялась в точности так, как выполнялись симуляторы.

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

Конечный автомат имеет конструкцию, которая поддерживает регистр, в котором хранится значение текущего состояния, а затем отдельно логику, котораявычисляет значение следующего состояния на основе текущего состояния и входных данных для модуля. (См. Машину Мили в литературе, например, в Википедии, в качестве альтернативы см. Машину Мура)

Исходя из анализа вашего кода, типичный конечный автомат Мили будет выглядеть так:

module sm (/*AUTOARG*/
   // Outputs
   data,
   // Inputs
   address, clk, read, rst
   ) ;
   input clk;
   input rst;
   input read;
   input [8:0] address
   output [31:0] data;
   reg [31:0] mem[256]

   // State registers for state
   reg [2:0] state, next_state;
   parameter idle_state = 0, read_state = 1;

   // State FF for state
   always @ ( posedge clk or rst ) begin
      if ( rst ) state = idle_state; else
        state = next_state;
   end

   // Next State Logic for state
   always @ ( /*AUTOSENSE*/ /*memory or*/ addr_in or idle_state
             or read or read_state or state) begin
      case (state) 
        idle_state: begin
           if (read) begin
              address    = addr_in;
              next_state = read_state;
           end
        end
        read_state: begin
           data = mem[address];
           next_state = idle_state;
        end
      endcase // case (cmd)
   end // always @ (...
endmodule // sm
...