- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是设计代码:
module mul_clock (input clkA, clkB, in, output out);
bit temp;
reg x[2:0];
always @ (posedge clkA)
temp <= temp ^ in;
always @ (posedge clkB)
x <= {x[1:0], temp};
assign out = x[2] ^ x[1];
endmodule
如何编写“Out”断言,因为它是多时钟设计。
我已经尝试过,但仍然出现一些错误。请帮助我修改此断言或编写另一个断言:
property p1;
bit t;
bit x[2:0];
@(posedge clkA)
(1'b1, t ^= in) |=> @(posedge clkB) (1'b1, x[0] = t) |=> @(posedge clkB) (out == x[2] ^ x[1], x[1] = x[0]) |=> @(posedge clkB) (out == x[2] ^ x[1], x[2] = x[1]);
endproperty
注意:通过始终 block 和单个时钟断言,我们可以验证输出端口。但如果可能的话,我想通过多时钟断言来完成此操作,而不需要任何始终阻止。
最佳答案
免责声明:我尚未对此进行测试。
你尝试过吗:
#1 @(posedge clkA) (1'b1, t ^= in) |->
#2 @(posedge clkB) (1'b1, x[0] = t) |=>
#3 @(posedge clkB) (out == x[2] ^ x[1], x[1] = x[0]) |=>
#4 @(posedge clkB) (out == x[2] ^ x[1], x[2] = x[1]);
也就是说,时钟切换具有重叠的含义。根据我的经验,非重叠含义将导致断言不在下一个 clkB 上采样,而是跳过一个 clkB,然后在 clkB 上采样。
此外,我不太明白为什么你在整个断言中都使用含义。第2行不是第3行的先决条件,对于第3行和第4行也是如此。按照我的理解,断言应该在每个 clkA 上开始,然后总是遵循一个序列。在这种情况下,以下内容会更正确,尽管之前的代码可能仍然有效。
@(posedge clkA)
(1'b1, t ^= in) |->
@(posedge clkB)
(1'b1, x[0] = t) ##1
(1'b1, x[1] = x[0]) ##1
(out == x[2] ^ x[1], x[2] = x[1]);
最后,如果 clkA 比 clkB 快得多,会发生什么?多个断言将并行启动,并且对 clkB 第一个 posege 上 t 的实际值存在分歧。我必须承认,我对属性本地值的范围很模糊,但请检查这是否会给您带来麻烦。可能的修复方法是在属性范围之外声明变量 t。因此,t 将在 clkA 的每个 pedge 上更新为新值,并且您将有 n 个断言检查相同的事情(这不是问题)。
编辑:我从第 #3 行删除了 out == x[2] ^ x[1]
检查,因为 x
是该属性的本地属性。因此,您无法检查此断言的其他实例所生成的值。
补充:如果上面的方法不起作用,或者如果启动并行断言检查同一件事似乎很浪费,那么下面的代码可能会起作用。
Edit2:将 x 放入属性中并更改属性中的最后两行以将 x 更新为正确的值。
bit t;
always_ff@(posedge clkA)
t ^= in;
property p1;
bit[2:0] x;
@(posedge clkB)
(1'b1, x[0] = t) |=>
(1'b1, x[1] = x[0]) ##0 (1'b1, x[0] = t) ##1
(1'b1, x[2] = x[1]) ##0 (1'b1, x[1] = x[0]) ##0 out == x[2] ^ x[1];
endproperty
最后有额外提示:创建的触发器应该具有重置功能。也就是说,x 和 temp 都应该在其各自的时钟域本地进行重置。重置可以是同步的,也可以是异步的,由您选择。这也必须添加到您的属性(property)中。另外:始终使用always_ff或always_comb,切勿使用always。
异步重置:
always_ff @ (posedge clkA or posedge arstClkA)
if(arstClkA)
temp <= 0;
else
temp <= temp ^ in;
关于verilog - Systemverilog 中的多个时钟断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33118460/
我为连接编写了如下代码,但显示错误: module main ; bit [4:0] a; reg b,c,d; initial begin b = 0; c =
我正在尝试创建一个 for 循环,在给定循环迭代的情况下将不同的值分配给逻辑数组。 因此,例如,假设我正在尝试实例化两个不同的积木,宽度均为 10,高度均为 5。我们还假设这些值中的每一个都是 10
我有一个 systemverilog 模块,它引用一个生成的头文件,其中包含各种类型定义和函数。这是可合成的代码。该模块之前工作正常,因为头文件是使用预处理器包含的。 现在我的架构发生了变化,我需要实
我将两种设计组合成一个单芯片设计。 RTL 代码是用 SystemVerilog 编写的,用于综合。不幸的是,这两种设计包含许多名称相同但逻辑略有不同的模块。 SystemVerilog 中是否有 n
我正在尝试在系统verilog中随机化3个不同的变量,但以循环方式。我的意思是,我有以下 3 个变量 rand int a; rand int b; rand int c; constraint c_
默认情况下,SystemVerilog 是按值还是按引用传递数组? 例如: int array[5] = '{0,1,2,3,4}; some_function(array); // <-- val
SystemVerilog 是否支持向下转型(将基础对象转型为派生对象)?如果是这样,怎么办? 下面的沮丧示例不起作用: class base; int a = 5; endclass class
这是设计代码: module mul_clock (input clkA, clkB, in, output out); bit temp; reg x[2:0]; always @ (p
我有 Verilog-95 背景,我正在尝试找出我不再需要跳过的 Verilog-95 障碍。 在 Verilog-95 中编写具有异步设置和复位功能的触发器的明显方法是: always @(pose
我在寄存器 block Regblock 中实例化了寄存器,如下所示: DUT.Regblock.Register1 DUT.Regblock.RegisterA DUT.Regblock.Regis
我正在尝试理解 SystemVerilog 中的向上转型和向下转型。向上转型是转换为父类(super class)型,而向下转型是转换为子类型。向上转型总是被允许的,但向下转型涉及类型检查。 所以我做
在 SystemVerilog 中有没有一种方法可以分析压缩结构并确定它的整体大小(以位为单位)? typedef struct packed unsigned { logic [15:0]
我经常使用 systemverilog。 我正在使用 UltraEdit 作为文本编辑器。我也使用 VIM。 有时我必须从其他地方复制代码并将其粘贴到我的代码中。 它可能没有正确缩进。再次正确缩进是一
我有两个打包的信号数组,我需要为该属性创建一个属性和关联的断言,以证明这两个数组在某些条件下是相同的。我正在正式验证并且该工具无法在单个属性中证明两个完整数组,因此我需要将其拆分为单个元素。那么有没有
有什么方法可以获取它在 SystemVerilog 中操作的对象的名称? 就像实现 object1.printName() 应该打印字符串 object1 最佳答案 不,语言中没有为类执行此操作的机
我正在尝试创建一个像这样的解包数组: logic [3:0] AAA[0:9]; 我想将此数组初始化为以下值: AAA = '{1, 1, 1, 1, 2, 2, 2, 3, 3, 4}; 为了提高效
我将一些 systermverilog 代码重写为 chisel,但我找不到在 chisel 中表达 systemverilog 的打包联合的好方法。例如, typedef struct packed
我正在尝试了解在 SystemVerilog 中应如何定义引脚。 我有: 一个普通的dataBus 一个 ramController 模块,可以在其 ioData 引脚上发送或接收数据。 一个可以写入
以下两个属性有何不同? property p1; @(posedge clk) disable iff (Reset) b ##1 c; endproperty property p2;
我正在尝试将一些 SystemVerilog 代码移植到 C++/SystemC,并且在我看到奇怪的数组索引的几行上有点卡住了。这是我所看到的简化版本。 typedef enum bit [2:0]
我是一名优秀的程序员,十分优秀!