Verilog 而for循环中的while循环

Verilog 而for循环中的while循环,verilog,modelsim,Verilog,Modelsim,嗨,伙计们,我在for循环中写了一个while循环,但它不起作用。我的编码有什么问题吗 always@ (posedge clk) begin if (delay) D = 1; else D = 0; if (a) begin for (g=0;g<10;g=g+1) begin high <= high_in; low <= low_in; delay = 0; while (count

嗨,伙计们,我在for循环中写了一个while循环,但它不起作用。我的编码有什么问题吗

always@ (posedge clk) begin
  if (delay) 
    D = 1;
  else
    D = 0;

  if (a) begin
    for (g=0;g<10;g=g+1) begin
      high <= high_in;
      low <= low_in;
      delay = 0;
      while (count == 0) begin // when i simulate the waveform cant come 
                                     out and it stuck at here
        ws = 1;
        count <= D;
        delay = 1;
      end
      delay = 0;
    end
  end
  else begin
    //other coding
  end
end
始终@(posedge clk)开始
如果(延迟)
D=1;
其他的
D=0;
如果(a)开始

对于(g=0;g如果您在
count
为零时进入while循环,则有一个无限循环。您在
count
上有一个非阻塞分配,因此它不会更新。请查找阻塞分配与非阻塞分配。

我发现此代码存在一些基本问题:- 1.在同一块中混合搭配块料和非块料。 2.在always块中使用blocking语句是一个问题 3.计数无重置/默认值,在循环外延迟。尽管决策基于此

几点建议:-

  • 尝试在always语句外使用for和while循环
  • 尝试为循环使用分配默认值

  • 按照EML的建议,再次尝试编写。尽量不要将不同的赋值组合起来。

    先生,您好,我已更改为阻塞赋值,但它仍然是相同的,所以哪一部分实际上是错误的?如果您有阻塞赋值,那么循环将继续执行,直到
    count
    D
    获得一个新值。如何执行这会发生吗?如果
    D
    为0怎么办?你的答案可能是在循环内将
    delay
    设置为1。但这不会退出循环。即使你确实退出了循环,你也会将
    delay
    再次设置为0。扔掉代码,重新开始。你的代码看起来更像是一个C代码。请记住,verilog是一个HDL而不是pr编程语言。尽量使你的代码可以合成