Verilog 中接近尾声的语法错误

Syntax error near end in Verilog

我正在编写 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

但是,我总是收到错误 "syntax error near end"。此处可能出现的语法错误是什么?

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

问题(除了 #5 后缺少的分号)是循环条件是 <= 1,对于 布尔值 将始终为真类型(具有唯一可能的值 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