@(posedge Clk)之间的区别; a <= 1'b1; 和@(posedge Clk)a <= 1'b1;

Pul*_*mon 10 verilog system-verilog

两者之间有什么区别吗?

@(posedge Clk);
   a<= 1'b1;
Run Code Online (Sandbox Code Playgroud)

@(posedge Clk)
   a<= 1'b1;
Run Code Online (Sandbox Code Playgroud)

注意Clk之后的分号.当我浏览测试平台时,我遇到了类似的代码行.我做了一些简单的实验,在模拟过程中找不到任何差异.由于分号的存在/不存在,这些行后面的代码的执行顺序是否会以任何方式改变?

dav*_*_59 15

任何程序语句的BNF语法基本上都是

statement_item := 
        {procedural_timing_control} statement;
Run Code Online (Sandbox Code Playgroud)

这意味着您可以在任何语句前面有0个或更多时序控件.在你的例子中@(posedge Clk)是一个时间控制,a<= 1'b1;是声明.

如果您的示例位于fork/join中,则会出现行为差异,因为前者是两个语句; 后者是一个陈述.

fork
  @(posedge Clk); a<=1'b1;
join
Run Code Online (Sandbox Code Playgroud)

在这种情况下,2个语句并行启动 - a不会等待分配posedge.


Mar*_*rty 12

你是对的 - 没有行为差异.

分号版本是:等等.做这个.非分号版本是:等等然后执行此操作.您有时会在单行中看到此表单:

@(posedge Clk) a<= 1'b1;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不正确。根据上下文的不同,会有差异。 (2认同)