在内部生成生成verilog+;生成附近出错(veri-1137)

在内部生成生成verilog+;生成附近出错(veri-1137),verilog,system-verilog,register-transfer-level,Verilog,System Verilog,Register Transfer Level,写了好几天的verilog代码,我有一个问题是“我们能在生成块中写生成块吗?”?我正在写一个RTL,类似这样: Where 'n' is a parameter. reg [DATA_WIDTH:0] flops [n-1:0]; generate if (n > 0) begin always @(posedge clk) begin if (en) begin flops[0] <= mem[addr]; end e

写了好几天的verilog代码,我有一个问题是“我们能在生成块中写生成块吗?”?我正在写一个RTL,类似这样:

Where 'n' is a parameter.
reg [DATA_WIDTH:0] flops [n-1:0];

generate
  if (n > 0) begin
    always @(posedge clk) begin
      if (en) begin
        flops[0] <= mem[addr];
      end
     end
     generate
       genvar i;
       for (i = 1; i <= n ; i = i + 1) begin
         always @(posedge clk) begin
           flops[i] <= flops[i-1];
         end
       end
     endgenerate
     always @(flops[n - 1])
       douta = flops[n - 1];
   else
     always @(posedge clk) begin
       if (en) begin
         primary_output = mem[addr];
       end
     end
   end
endgenerate
不知道为什么。此RTL的目的是在设计的输出端创建一个“n”触发器管道

假设n为2,则电路应为:

flop1-> flop2-> primary output of design

flop1和flop2是新创建的触发器。

您离您应该到达的位置还有很长的路要走

Verilog不是一种编程语言;它是一种硬件描述语言。您可以将硬件建模为并发进程网络。每个进程都模拟一小段硬件,如计数器、状态机、移位寄存器、一些组合逻辑。。。在Verilog中,每个进程都被编码为
始终
块。因此,一个
始终
语句永远不会出现在另一个语句中;这毫无意义

其次,
generate
是一个非常专门的语句。当需要大量或可变数量的并发进程时,可以使用它。这不是常见的需要,因此
generate
并不常见,但在需要时非常有用。实现可参数化移位寄存器不需要generate语句。而且,由于
始终
块是并发语句,因此它位于
生成
语句中,而不是相反

我不知道你的设计意图到底是什么,我怀疑这段代码并不能完全满足你的需求。但是,它确实实现了一个长度
n
和宽度
DATA\u宽度+1
的可参数化移位寄存器(你真的这么说吗?),由
en
输入启用:

module N_FLOPS #(n = 2, DATA_WIDTH = 8) (input [DATA_WIDTH:0] dina, input clk, en, output [DATA_WIDTH:0] douta);

  reg [DATA_WIDTH:0] flops [n-1:0];

  always @(posedge clk)
    if (en)
      begin : SR
        integer i;
        flops[0] <= dina;
        for (i = 1; i <= n ; i = i + 1) 
          flops[i] <= flops[i-1];
      end

  assign douta = flops[n-1];

endmodule

你离你应该去的地方还有很长的路要走

Verilog不是一种编程语言;它是一种硬件描述语言。您可以将硬件建模为并发进程网络。每个进程都模拟一小段硬件,如计数器、状态机、移位寄存器、一些组合逻辑。。。在Verilog中,每个进程都被编码为
始终
块。因此,一个
始终
语句永远不会出现在另一个语句中;这毫无意义

其次,
generate
是一个非常专门的语句。当需要大量或可变数量的并发进程时,可以使用它。这不是常见的需要,因此
generate
并不常见,但在需要时非常有用。实现可参数化移位寄存器不需要generate语句。而且,由于
始终
块是并发语句,因此它位于
生成
语句中,而不是相反

我不知道你的设计意图到底是什么,我怀疑这段代码并不能完全满足你的需求。但是,它确实实现了一个长度
n
和宽度
DATA\u宽度+1
的可参数化移位寄存器(你真的这么说吗?),由
en
输入启用:

module N_FLOPS #(n = 2, DATA_WIDTH = 8) (input [DATA_WIDTH:0] dina, input clk, en, output [DATA_WIDTH:0] douta);

  reg [DATA_WIDTH:0] flops [n-1:0];

  always @(posedge clk)
    if (en)
      begin : SR
        integer i;
        flops[0] <= dina;
        for (i = 1; i <= n ; i = i + 1) 
          flops[i] <= flops[i-1];
      end

  assign douta = flops[n-1];

endmodule

仅供参考:SystemVerilog允许在单个语句中分配多维数组。因此,您可以使用
always@(posedge clk)begin flop[0]1)flops[n-1:1]跳过for循环供参考:SystemVerilog允许在单个语句中分配多维数组。因此,您可以使用
always@(posedge clk)begin flop[0]1)flop[n-1:1]跳过for循环
always @(posedge CLOCK)  // or negedge
  begin
    // do things that occur on the rising (or falling) edge of CLOCK
    // stuff here gets synthesised to combinational logic on the D input
    // of the resulting flip-flops
  end