0

这里我有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”。但它不工作。

有什么建议么。

4

2 回答 2

1

您使用的语法非常接近合法语法,但不是您想要的!

替换&&or

always @(posedge clk or posedge en)

这将在 clk 上触发并在 en 上触发,这会产生en一个异步信号。在数字设计中应该非常小心地处理异步信号。

正如@nio 所建议的那样,您真正想做的是在 clk 上触发,然后检查 enable 是否为高。

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

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

于 2013-07-12T13:48:51.230 回答
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
于 2013-07-12T13:24:25.183 回答