【问题标题】:Syntax error near end in VerilogVerilog中的语法错误接近尾声
【发布时间】:2016-09-10 15:37:01
【问题描述】:

我正在编写一个 Verilog 代码,以将所有可能的输入组合提供给 4:1 多路复用器。这是测试代码的测试平台:

module FouthQuestion_tb;

reg d0, d1, d2, d3, s0, s1;
wire y;
reg o;

FourthQuestion mygate(.D0(d0), .D1(d1), .D2(d2), .D3(d3), .S0(s0), .S1(s1), .Y(y));

initial
begin
    $monitor(d0, d1, d2, d3, s0, s1, y);
    for(d0=0; d0<=1; d0=d0+1)
    begin
        for(d1=0; d1<=1; d1=d1+1)
        begin
            for(d2=0; d2<=1; d2=d2+1)
            begin
                for(d3=0; d3<=1; d3=d3+1)
                begin
                    for(s0=0; s0<=1; s0=s0+1)
                    begin
                        for(s1=0; s1<=1; s1=s1+1)
                        begin
                            #5
                        end
                    end
                end
            end
        end
    end
end

endmodule

但是,我总是收到“语法错误接近尾声”错误。这里可能出现的语法错误是什么?

【问题讨论】:

    标签: verilog hdl


    【解决方案1】:

    #5 后面缺少一个分号。它应该给你一个行号来指出是哪个end 导致了问题

    【讨论】:

    • 语法上#5后面不需要分号。
    • 是的,有需要。程序时序控制是另一个语句或空语句的前缀。参见 BNF A.6.5 中的 procedural_timing_control_statement
    • 好吧...删除了错误,但我没有得到想要的输出。只有变量 s1 似乎在变化,而其他变量没有变化。这是为什么呢?
    • 您希望每个循环执行多少次?为什么?
    • 我期望(并且希望)每个循环执行 2 次,这意味着所有 64 种输入组合都将使用 $monitor 及其相应的输出显示。
    【解决方案2】:

    问题(除了#5 后面缺少分号)是循环条件是&lt;= 1,对于 boolean 类型(只有可能的值 0 和1)。因此它永远不会退出内部循环,而是永远运行,只切换s1

    您应该改用可以取大于您正在比较的值的值的循环变量,例如 int。为简化起见,您可以使用一个循环变量,该变量包含的位至少比所有布尔变量加在一起的位多,然后通过连接将多位结果分配给每个变量。请参阅以下示例。

    integer i;
    
    initial begin
      $monitor(d0, d1, d2, d3, s0, s1, y);
      for (i=0; i<2**6; i=i+1) begin
        {d0,d1,d2,d3,s0,s1} = i;
        #5;
      end
    end
    

    【讨论】:

    • 嘿...我实际上是 Verilog 的新手,你能解释一下 i
    • 2**6 是 2 的 6 次方(您拥有的布尔变量的数量)。并且 {...}=i 将 d0 分配给 i[5],d1 分配给 i[4],d2 分配给 i[3],依此类推。
    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多