断言通常被称为序列监视器或者序列检验器,是对设计应当如何执行特定行为的描述,是一种嵌入设计检查。如果检查的属性(property)不是我们期望的表现,那么在我们期望事件序列的故障上会产生警告或者错误提示。
断言用来检查模拟序列行为或者激励生成的正确性,断言作为功能验证的一种重要手段,可以脱离测试用例而覆盖测试点,所以断言覆盖率可以是功能覆盖率的一部分,完善的断言能为全面的功能覆盖率尺度打下良好的基础。
断言两个重要的时间点:采样时刻和匹配时刻,断言在 preponed 域采样,在observed 域执行检查。如下图所示:

断言可以分为多个层面,包括:
在当前时刻断定信号的数值情况。例如
asser_inst:assert (foo) $display("pass");
else $display("failed");
//名字:assert(判断语句)若真执行语句1,否则执行语句2
例如:

例:a ##3 b
含义是 a 有效后的第 3 拍(a 有效当拍为第 0 拍),b 也有效。如果 b 在第 3 拍未能有效,则序列匹配失败,如下图所示:

a ##[m:n] b,例如a ##[2:4] b意味着a有效后的第2拍到第4拍之间b有效至少一次则序列匹配成功。
例子:波形为a ##3 b ##0 c,a ##3 b在120ns匹配成功,当拍a ##3 b ##0 c也匹配成功,因为120ns也是c的起点。

例1:a[*3],含义是a连续为1重复3拍,即a ##1 a ##1 a,如图所示:

例2:(a ##1 b)[*3],这个序列等同于(a ##1 b) ##1 (a ##1 b) ##1 (a ##1 b) ,如图所示:

例3:a [*m:n] b,如a[*2:4]含义为a信号重复2~4拍后b信号有效均可匹配成功,等同于a [*2] b or a [*3] b or a[*4] b。
如a [->3],或者叫go-to重复符。含义是a非连续重复3次,只在第3次重复时刻点匹配(跟随的含义)。
例1:a ##1 b[->3] ##1 c,该序列表示在a有效之后,c有效之前,b应该有效3次且最后一次有效的时间应当恰好比c有效早1拍(跟随性),如下图所示:

例2:a [->m:n],对于序列a ##1 b[->2:3] ##1 c,即a重复2次或者3次时均匹配成功,以下两个波形都匹配成功。


例1:a [=3],含义是a无所谓连续不连续,重复了3次即匹配成功了。波形理解,图中标蓝的点都是匹配成功的点(无需跟随)

而**a[->3]**匹配成功的点,只有一个(跟随)

例2:a ##1 b[=3] ##1 c,对于该序列,以下波形可以匹配成功,注意c无需跟随b[=3]。

and运算符用来连接两个事件(多为序列),当两个事件均成功时匹配成功,需要注意的是两个事件必须有相同的起始点,但是可以有不同的结束点。
or运算符用来连接两个事件(多为序列),当两个事件任一匹配成功则整体成功,与|的区别和之前类似,or可以连接两个表达式或是两个序列,|只能连接两个表达式
intersect和and有些类似,均为连接两个事件,两个事件均成功整个匹配才成功。不过intersect多了一个条件,那就是两个事件必须在同一时刻结束(and已经需要保证两个事件同一时刻开始了),换句话说a intersect b能匹配成功,a、b两个序列的长度必须相等。
例如,(a ##[1:2] b) intersect (c ##[2:3] d),如下图。图中黄色点为a ##[1:2] b匹配成功时刻点,蓝色为c ##[2:3] d匹配成功点,根据我们之前的分析,intersect连接的两个序列必须有同样的结束时刻,因此整个序列匹配的时间点一定在黄色和蓝色重合的点中。

a within b的含义是在事件b(序列b)匹配期间,事件a(序列a)至少出现1次则匹配成功,否则失败。如(a ##1 b[=3]) within (c ##1 d[->1])。

throughout运算符和intersect有些接近,区别在于throughout必须连接一个表达式和一个序列,即req throughout seq,含义是在seq匹配起始到结束期间,req都必须成立。例如a throughout (b ##1 c[->1])就要求从b有效开始,直到c第一次有效结束,这段期间a必须始终保持有效,如下波形图60ns~140ns就是一次典型的匹配成功。

$rose()函数即上升沿检测,匹配规则是信号的当拍值为1上拍数据为0。以$rose(a, clk1)为例,如下图所示:

$fell()函数和$rose函数刚好相反,是检测下降沿的
$fell()函数和$rose函数的结合体,当拍采样值与上一拍不一致则匹配成功
$stable和$change刚好相反,信号当拍采样值与上一拍一样则匹配成功
任意时钟沿,表达式a都只有1bit为高
任意时钟沿,表达式a都只有1bit为高或均为低电平
任意时钟沿,表达式a任意位是否有X态或者Z态,如果有则匹配,没有X态或Z态则报错
用于返回表达式中高电平的bit数量
蕴含算子类似代码中的if语句。蕴含算子仅两个:|->和|=>,二者区别也很简单:
显然在Test::Unit中没有assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb来添加它?这是最好的方法吗?我不想修改test/unit/assertions.rb。顺便说一句,我不认为这是多余的。我使用的是assert_equalfalse,something_to_evaluate。这种方法的问题是很容易意外使用assertfalse,something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。 最佳答案
我想优化一些较慢的规范。此类规范的示例如下所示:require'rspec'classHeavyComputationdefcompute_resultsleep1#somethingcomputeheavyhere"verybigstring"endenddescribeHeavyComputation,'preferredstyle,butslow'dosubject{described_class.new.compute_result}it{shouldinclude'big'}it{shouldmatch'string'}it{shouldmatch/very/}#+50oth
我正在尝试编写这样的代码:assert_throws(:ExtractionFailed){unit.extract_from('5x2005')}ExtractionFailed是Exception的一个简单子(monad)类,在test/unit下,我试图断言它在我调用unit.extract_from(...坏数据...)我已经将ExtractionFailed移动到SemanticText模块中,所以现在test/unit说:expectedtobethrownbutwasthrown.我尝试编写assert_throws(:SemanticText::ExtractionFa
每当我尝试assert_equal两个对象时,我总是会遇到这样的错误:NovisibledifferenceintheUser#inspectoutput.Youshouldlookattheimplementationof#==onUseroritsmembers.Time和Array也发生过这种情况。Minitest文档对此也没有说太多。我使用的是Ruby2.0.0,但我使用的是2.2.0,同样的事情发生了。也使用最新的minitest。此外,我正在运行Ubuntu14.10。 最佳答案 关于留言当断言失败时显示这条消息,有点不
我有一个Rails3集成测试来测试我的路线。它包含如下测试:assert_routing("/#{@category.url.path}/#{@foo.url.path}",{:controller=>'foo',:action=>'show',:category=>@category.to_param,:foo=>@foo.to_param})我还想测试一个没有路由匹配的情况。显然,测试生成在这种情况下没有任何意义,所以我只需要assert_recognizes的倒数。我希望能够做这样的事情:assert_not_recognized('/adfhkljkdhasjklhjkldfa
我刚刚经历了这个概念Zero-WidthAssertions从文档中。我想到了一些快速的问题-为什么这样的名字Zero-WidthAssertions?Look-ahead怎么了和look-behind概念支持这样的Zero-WidthAssertions概念?什么这样的?,,=s,-4个符号在模式内指示?你能帮我集中精力了解实际发生的事情我还尝试了一些小代码来理解逻辑,但对它们的输出没有那么自信:irb(main):001:0>"foresight".sub(/(?!s)ight/,'ee')=>"foresee"irb(main):002:0>"foresight".sub(/(?
假设我有一个这样的类定义:classFoodefinit(val)@val=valenddefself.bar:barenddefval@valendend规范如下:describeFooit{shouldrespond_to(:val)}it{shouldrespond_to(:bar)}end第二个it断言失败。从RSpec的文档中我不清楚respond_to应该在类方法上失败。 最佳答案 现在建议我们使用expect,像这样:describeFoodoit'shouldrespondto:bar'doexpect(Foo).t
你能在irb中执行assert_equal吗?这是行不通的。require'test/unit'assert_equal(5,5) 最佳答案 当然可以!require'test/unit'extendTest::Unit::Assertionsassert_equal5,5#发生的事情是所有断言都是Test::Unit::Assertions模块中的方法。从irb内部扩展该模块使这些方法可用作main上的类方法,这使您可以直接从irb提示符中调用它们。(实际上,在任何上下文中调用extendSomeModule都会将方法放在该模块中
场景我正在编写一个库(没有RubyonRails),我想为其提供非常详细的Cucumber功能。这尤其包括描述在各种情况下应该抛出的错误/异常。示例编写Cucumber步骤最直观的方式可能是这样的WhenIdosomethingunwantedThenan"ArgumentError"shouldbethrown问题我必须解决两个问题:抛出异常时,第一步不应失败。第一步抛出的异常应该可供第二步访问,以便执行一些断言魔法。不优雅和繁琐的解决方案我能想到的最佳方法是在第一步中缓存异常并将其放入第二步可以访问的实例变量中,如下所示:When/^Idosomethingunwanted$/do
我想在我的ruby代码中使用断言和验证(例如:检查是否创建了zip文件、标签是否存在、文本区域中的消息等)。我已经放置了一些断言语句,例如assert@selenium.is_text_present(textMessage),但它们不起作用。如果要安装任何用于断言的rubygem,请告诉我。 最佳答案 对于简单的断言,你可能最好使用一个block来滚动你自己的断言方法:ruby-1.9.1-p378>classAssertionErrorend=>nilruby-1.9.1-p378>defassert&blockruby