执行始终在verilog中阻止

时间:2013-07-12 13:20:06

标签: cloc

这里有verilog代码:

module test;
  reg     wr,  rd;
  reg     clk, en;
  integer count=1; 

  initial begin
    clk = 0;
    forever #5 clk=~clk;
    en = 0;
    #5 en = 1;
    forever #10 en=~en;
  end

  always @(posedge clk && posedge en) begin //<-- Error here
    if(count %2 == 1) begin 
      wr=1;
      $display("writing");
    end
    else begin
      rd=1;
      $display("reading");
    end
  end
endmodule

该程序在第14行显示错误。当“clk”和“en”都发出高电平时,我想执行“always block”。但它不起作用。

任何建议。

2 个答案:

答案 0 :(得分:1)

您使用的语法非常接近法律语法,但不符合您的意图!

&&替换为or

always @(posedge clk or posedge en)

这将触发clk并触发en,这会使en成为异步信号。在数字设计中应该非常小心地处理异步信号。

正如@nio建议你真正要做的是在clk上触发,然后检查启用是否很高。

always @(posedge clk) begin
  if (en == 1'b1)     begin
    ..
  end
end

只要没有else子句,这是一个好处,这是合成工具使用自动时钟门插入的很好的语法。

答案 1 :(得分:0)

如果您只检测clk的正边沿并测试块内的en = 1会怎么样?这是一种正常的方法......你应该有一个主时钟并测试一个块内的其他信号

always @(posedge clk)
begin
    if (en==1'b1)
    begin
        if(count %2 == 1)
        begin
            wr=1;
            $display("writing");
        end
        else
        begin
           rd=1;
           $display("reading");
        end
    end
end