3个或更多的序列:Verilog调试

3个或更多的序列:Verilog调试,verilog,hardware-programming,iverilog,Verilog,Hardware Programming,Iverilog,我是Verilog编码新手,代码中有一个错误。有人能帮忙调试吗 主要代码: module tff (q,t,clk,clear); input t,clk,clear; output reg q; always @(negedge clk or posedge clear) begin if (clear) q <= 0; else if(t==1) q <= ~q; else q<= q; end endmodule module

我是Verilog编码新手,代码中有一个错误。有人能帮忙调试吗

主要代码:

module tff (q,t,clk,clear);
  input t,clk,clear;
  output reg q;
  always @(negedge clk or posedge clear)
  begin
    if (clear) q <= 0;
    else if(t==1) q <= ~q;
    else q<= q;
  end
endmodule

module seriesof3 (y,q1,q2,a,clk,clear);
  input a,clk,clear,q1,q2;
  output reg y,q1,q2;
  always @(negedge clk or posedge clear)
  begin
    if (clear) begin
        q1 <= 0;
        q2 <= 0;
     end
    else begin
        tff ta (q1,a,clk,clear);
        tff tb (q2,~q1&(q2^a),clk,clear);
        y <= a&q2;
     end
  end
endmodule
模块tff(q、t、clk、清除);
输入t、clk、clear;
输出寄存器q;
始终@(negedge clk或posedge clear)
开始

如果(清除)q是,您有几个问题:-)

  • 模块
    tff
    在always块(实例ta和tb)内实例化。这在verilog中是非法的。您需要将实例化移到外部
  • 您非法将端口
    q1
    q2
    定义为输入,同时定义为输出。它们应该只是输出
  • 在时间刻度之前使用了不正确的字符。应该是背面的勾号“`”。时间刻度语法中没有
    =
    的位置
  • 在声明moduel testbench之后,您忘记了分号
  • 在$display和其他中,
    $
    后面有空格<代码>$
  • 是名称的一部分
  • 您的
    永久
    必须位于初始块内,然后将其置于外部
  • 您在testbench模块定义中列出了端口,但没有指定它们的方向。我想你根本不需要任何港口
  • 在$dumpvars中没有像test_bench这样的想法。有一个测试台(没有下划线)
  • 在您的情况下,
    q1
    q2
    由aways块和模块实例驱动多次。由于还可以在tff模块内初始化它们,因此不需要在seriesof3中初始化它们
  • forever
    语句后面有一些代码。这段代码永远不会执行。您需要另一个初始块,我建议永久语句使用一个单独的块。此外,您还需要初始化clk信号,否则它将保持在“x”
  • 在初始块中不应使用非块指定,除非您完全理解为什么需要它们
  • 下面是一个语法固定的代码:

    module tff (q,t,clk,clear);
      input t,clk,clear;
      output reg q;
      always @(negedge clk or posedge clear)
      begin
        if (clear) q <= 0;
        else if(t==1) q <= ~q;
        else q<= q;
      end
    endmodule
    
    module seriesof3 (y,q1,q2,a,clk,clear);
      input a,clk,clear;
      output reg y,q1,q2;
      always @(negedge clk or posedge clear)
      begin
        if (clear) begin
            //q1 <= 0;
            //q2 <= 0;
         end
        else begin
            y <= a&q2;
         end
      end
      tff ta (q1,a,clk,clear);
      tff tb (q2,~q1&(q2^a),clk,clear);
    
    endmodule
    
    
    `timescale  1 ms/1 ms
    module testbench(); //(y,a,clk,clear);
      reg a,clk,clear;
      wire y,q1,q2;
      seriesof3 DUT (y,q1,q2,a,clk,clear);
      initial
        begin 
            $dumpvars(0,testbench);
            $dumpfile("first.vcd");
            $monitor ($time,"a=%b, Y= %b",a,y);
            clear=0;
            a=0;
            #2 clear=1;
            #5 clear=0;
     
              #8 a=0;
              #5 a=1;
              #5 a=1;
              #5 a=1;
              #5 a=1;
              #5 a=0;
              #5 a=1;
              #5 a=1;
              #5 a=0;
              #5 a=1;
              #5 a=1;
              #5 $finish;
            end
    
        initial begin
            clk = 0;
            forever #5 clk= ~clk;
        end
      
       
    endmodule
    
    模块tff(q、t、clk、清除);
    输入t、clk、clear;
    输出寄存器q;
    始终@(negedge clk或posedge clear)
    开始
    
    如果(清除)q您能指定您面临的错误类型吗?非常感谢您对我犯的每一个错误进行调试和解释。
    module tff (q,t,clk,clear);
      input t,clk,clear;
      output reg q;
      always @(negedge clk or posedge clear)
      begin
        if (clear) q <= 0;
        else if(t==1) q <= ~q;
        else q<= q;
      end
    endmodule
    
    module seriesof3 (y,q1,q2,a,clk,clear);
      input a,clk,clear;
      output reg y,q1,q2;
      always @(negedge clk or posedge clear)
      begin
        if (clear) begin
            //q1 <= 0;
            //q2 <= 0;
         end
        else begin
            y <= a&q2;
         end
      end
      tff ta (q1,a,clk,clear);
      tff tb (q2,~q1&(q2^a),clk,clear);
    
    endmodule
    
    
    `timescale  1 ms/1 ms
    module testbench(); //(y,a,clk,clear);
      reg a,clk,clear;
      wire y,q1,q2;
      seriesof3 DUT (y,q1,q2,a,clk,clear);
      initial
        begin 
            $dumpvars(0,testbench);
            $dumpfile("first.vcd");
            $monitor ($time,"a=%b, Y= %b",a,y);
            clear=0;
            a=0;
            #2 clear=1;
            #5 clear=0;
     
              #8 a=0;
              #5 a=1;
              #5 a=1;
              #5 a=1;
              #5 a=1;
              #5 a=0;
              #5 a=1;
              #5 a=1;
              #5 a=0;
              #5 a=1;
              #5 a=1;
              #5 $finish;
            end
    
        initial begin
            clk = 0;
            forever #5 clk= ~clk;
        end
      
       
    endmodule