@(posedge clk)可以合成吗?

时间:2019-10-01 05:49:01

标签: verilog

以下代码可以合成吗?在代码中,使用@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 :(得分:0)

您显然正在尝试创建状态机,这是在Verilog中构建的完全受支持的东西。就其他人理解您的代码而言,只是他们编码的方式不是最清晰的方法,而且非常重要的是,精确实现所需内容的综合和实现工具也很重要。

您问我是否可以更精确地了解目前对设计进行编码的方式有哪些不好或不明确的地方?当然。语句@(posedge clk);内联使用表示在执行先前的语句之后停止当前代码的执行,直到时钟从低到高为止。在模拟器或c程序中,可以这样做;您将暂停实施始终阻塞的过程。此外,当原始敏感度列表“总是@(read或rst)”中的事件发生时,该工具将(以某种方式)安排不再激活该代码。但现在,当发生事件姿势时钟时,恢复该过程。

对于要实现此功能的综合工具,它必须构建逻辑,该逻辑有时会寻找读和rst,而另一些时候则寻找将时钟从0更改为1;并跟踪何时进行哪些活动。还是重申一下,它必须创建一个状态机来实现您的编码样式(然后创建另一个状态机!)。尽管一切皆有可能,但需要进行权衡。

综合工具的原始作者与Verilog模拟器的原始编码员和逻辑设计人员会面,并达成协议(IEEE Std 1364.1-Verilog寄存器传输级综合)来定义什么样的结构对于人类而言是容易编码,高效的可以让仿真器执行,而综合工具则可以直接构建完全按照仿真器执行方式执行的逻辑。

按照这种指导,最好以一种清晰的硬件实现方法来描述所需的状态机。

状态机具有一个构造,该构造维护一个保存当前状态值的寄存器,然后维护一个单独的逻辑,该逻辑根据当前状态和模块的输入来计算下一个状态的值。 (请参见文献中的Mealy机器,例如Wikipedia,或者请参见Moore机器)

基于查看您的代码,典型的Mealy状态机将是:

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

答案 1 :(得分:0)

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

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