首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >系统verilog::静态变量,非阻塞分配程序块?

系统verilog::静态变量,非阻塞分配程序块?
EN

Stack Overflow用户
提问于 2014-08-16 23:16:37
回答 2查看 570关注 0票数 0

我刚接触过系统verilog,并且一直坚持一个基本的概念,请提供以下行为背后的基本原理:

  1. 在System中,为什么在程序块范围之外声明的静态类属性不能与程序块的阻塞赋值一起分配?

2.为什么,即使用非阻塞语句分配静态变量,静态变量中的更改是不可见的($display),在延迟后(比如#1 )是可用的。

示例:

代码语言:javascript
复制
class A ;
 static int i;
endclass

program main ;
A obj;

initial
begin

  obj.i = 123; // Not Allowed, can only be done using <= ... WHY ??
  $display(obj.i);
  #1 $display(obj.i);
end
endprogram 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-17 01:59:48

  1. 在SystemVerilog中,“程序”块的目的是保证如果用户将自己的测试台封装在程序块中,并将测试块保持在程序块之外,那么测试台和DUT之间就不会出现任何争用状态。另一种避免竞争条件的方法是将DUT/testbench交互限制在接口/时钟块上。还注意到: ( a)阻塞分配(因为它们是立即执行的,因此执行的结果可能随线程的执行顺序而变化)可能导致争用条件。 b)硬件(RTL)变量只能是静态的。 在整个场景中,编译器认为阻塞语句可能导致DUT和testbench之间的争用条件。因此出现了错误。
  2. 当您使用非阻塞分配时,分配将被调度,并且不会立即执行.一旦调度程序有机会执行它,它就会被执行。这种情况只有在当前线程产生之后才会发生,因为一个阻塞表达式涉及时间增量。在给定的代码段中,在执行线程遇到#1时发生的代码片段中,#1之后的$display将看到非阻塞分配的结果,而前面的一个则不会。
票数 -1
EN

Stack Overflow用户

发布于 2014-08-18 03:53:13

IEEE 1800-2012 LRM早期版本的SystemVerilog中没有这样的规则,对允许的分配类型有更多的限制,但这些限制都已被删除。我不建议任何人再使用程序块。这是一个不必要的混乱的主要根源。请参阅http://go.mentor.com/programblocks

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25344890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档