与关系运算符重复的含义是什么?

时间:2016-08-31 14:45:34

标签: verilog system-verilog

我知道repeat(number)的含义是什么,但在下列情况下含义是什么:

repeat(m_wr_queue.size()==0) @(posedge m_vif.AXI_ACLK);?

3 个答案:

答案 0 :(得分:5)

这是非常糟糕的代码。关系运算符的结果是1'b0或1'b1,因此产生的效果与

相同
\b

比原版更少的字符,更具可读性。

然而,他们有可能写出一些不是他们的意图。通常你想继续等待直到队列中有东西。然后他们应该写的是

if (m_wr_queue.size()==0) @(posedge m_vif.AXI_ACLK);

答案 1 :(得分:3)

如果AXI_ACLK为空,代码将等待m_wr_queue行的上升沿。基本上,编写if子句是一种难以理解的方式。

以下是两种可能性:

  • 空排队(即size() == 0

    repeat (1) @(posedge m_vif.AXI_ACLK);

  • 队列大小> 0:

    repeat (0) @(posedge m_vif.AXI_ACLK);

我建议用更易读的东西(即简单的if子句)替换它。简单的代码是没有用的,如果你必须盯着它两倍的时间来理解它。存储(几行额外的代码)现在几乎是无限的,你的时间不是。

答案 2 :(得分:0)

我同意dave_59。我相信作者正在阅读https://github.com/funningboy/uvm_axi/blob/master/sv/axi_slave_driver.sv中的AXI从驱动程序实现。

这些是我到目前为止所了解的,

axi_slave_monitor观察到写事务已完成。 这意味着写地址和数据由axi_master_driver和 axi_slave_monitor检测到地址和数据都进行了主/从握手(AWREADY == AWVALID == 1和WREADY == WVALID == 1)。

然后,监视器调用axi_slave_driver中实现的函数(TLM导出称为“写”),该函数将填充队列。

axi_slave_driver监视此队列是否为空;如果不为空,则表示驱动程序应驱动axi写响应信号。

该行代码应“等待”完成队列。