首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Johnson计数器语法错误。意外的标记:生成

Johnson计数器语法错误。意外的标记:生成
EN

Stack Overflow用户
提问于 2020-11-27 00:54:05
回答 2查看 388关注 0票数 2

我的大学老师要求我实现一个约翰逊计数器和它的测试台,使用一个width<=32 (他称之为N参数),并且实现必须使用generate/for结构。虽然我已经学习了一些关于约翰逊计数器的知识,但我不知道在这种情况下如何使用generate,并且当我试图运行测试平台时,我遇到了一些错误。到目前为止,我的实现如下:

代码语言:javascript
复制
module johnsonCounter #(parameter N = 32)  
  ( 
    input clk,                
    input rstn,
    output reg [N-1:0] out
  );    

  always @ (posedge clk) begin
    if (!rstn)
      out <= 1;
    else begin
      out[N-1] <= ~out[0];
      generate
        for (int i = 0; i < N-1; i=i+1) begin
          out[i] <= out[i+1];
        end
      endgenerate

    end
  end
endmodule

这是测试平台:

代码语言:javascript
复制
module tb;
  parameter N = 32;
  
  reg clk;
  reg rstn;
  wire [N-1:0] out;
  
  johnsonCounter    u0 (.clk (clk),
                .rstn (rstn),
                .out (out));
  
  always #10 clk = ~clk;
  
  initial begin
    {clk, rstn} <= 0;

    $monitor ("T=%0t out=%b", $time, out);
    repeat (2) @(posedge clk);
    rstn <= 1;
    repeat (15) @(posedge clk);
    $finish;
  end
  
  initial begin
    $dumpvars;
    $dumpfile("dump.vcd");
  end
endmodule

以下是错误:

代码语言:javascript
复制
ERROR VCP2000 "Syntax error. Unexpected token: generate[_GENERATE]. This is a Verilog keyword since IEEE Std 1364-2001 and cannot be used as an identifier. Use -v95 argument for compilation." "design.sv" 13  7
ERROR VCP2020 "begin...end pair(s) mismatch detected. 2 <end> tokens are missing." "design.sv" 17  7
ERROR VCP2020 "module/macromodule...endmodule pair(s) mismatch detected. 1 <endmodule> tokens are missing." "design.sv" 17  7
ERROR VCP2000 "Syntax error. Unexpected token: endgenerate[_ENDGENERATE]. This is a Verilog keyword since IEEE Std 1364-2001 and cannot be used as an identifier. Use -v95 argument for compilation." "design.sv" 17  7

欢迎任何帮助=)

EN

回答 2

Stack Overflow用户

发布于 2020-11-27 01:06:41

以这种方式使用generate是非法的。

对于您的代码,只需要一个for循环(没有generate):

代码语言:javascript
复制
  always @ (posedge clk) begin
    if (!rstn)
      out <= 1;
    else begin
      out[N-1] <= ~out[0];
      for (int i = 0; i < N-1; i=i+1) begin
          out[i] <= out[i+1];
      end
    end
  end

有关generate语法,请参阅IEEE标准1800-2017,第27节。生成构造。

票数 1
EN

Stack Overflow用户

发布于 2020-12-04 20:17:45

我尝试使用generate构造来实现它。我在这方面也是新手,所以如果有人看到任何问题或错误,或者可以提供任何建议来提高性能,我将不胜感激。

关于你的问题,我总是使用generate来实例化几个模块,我认为它使我的代码更清晰,更容易理解。所以我所做的就是定义一个简单的D触发器模块,我将使用它来实例化它。如果你想使用generate,你必须用genvar定义一个迭代变量。此外,您应该在always块之外使用generate (我不知道是否存在可以在always块内使用它的情况)。下面,您可以看到代码。

代码语言:javascript
复制
module ff 
  (
    input clk,
    input rstn,
    input d,
    output reg q,
    output reg qn
  );
  
  always @(posedge clk)
    begin
      if(!rstn)
        begin
          q <= 0;
          qn <= 1;
        end
      else
        begin
          q <= d;
          qn <= ~d;
        end
    end
endmodule

module johnsonCounter #(parameter N = 4)  
  ( 
    input clk,                
    input rstn,
    output [N-1:0] out,
    output [N-1:0] nout
  );    

  genvar i;
  generate
    for (i = 0; i < N-1; i=i+1) begin
      ff flip (.clk(clk), .rstn(rstn), .d(out[i+1]), .q(out[i]), .qn(nout[i]));
    end
  endgenerate
  
  ff lastFlip (.clk(clk), .rstn(clk), .d(nout[0]), .q(out[N-1]), .qn(nout[N-1]));
endmodule

在这里,您也有测试平台。我从您的代码中更改的一件事是dumpfile行。它应该放在dumpvar之前。

代码语言:javascript
复制
module tb;
  parameter N = 4;
  
  reg clk;
  reg rstn;
  wire [N-1:0] out;
  
  johnsonCounter    u0 (.clk (clk),
                .rstn (rstn),
                .out (out));
  
  always #10 clk = ~clk;
  
  initial begin
    {clk, rstn} <= 0;

    $monitor ("T=%0t out=%b", $time, out);
    repeat (2) @(posedge clk);
    rstn <= 1;
    repeat (15) @(posedge clk);
    $finish;
  end
  
  initial begin
    $dumpfile("dump.vcd");
    $dumpvars;
  end
endmodule

这段代码是使用EDA Playground测试的,它工作得很好,但正如我所说的,我不是专家,所以如果有人发现任何错误或有任何建议,欢迎使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65026274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档