我正在修复下面源代码的一些问题。 我正在创建预言机,将预期值与我得到的实际值进行比较。 我尝试计算的期望值是变量“e”。 我得到的实际值是变量“z”。
所以,当“e===z”时,变量“ok”应该为“1”。但即使 'e===z' 为 true,它也不会将 'ok' 设置为 '1'。
这是源代码。
module lab9;
reg [31:0] d;
reg clk, enable, flag;
wire [31:0] z;
reg [31:0] e,ok;
register #(32) mine(z, d, clk, enable);
always begin
#1 clk = ~clk;
end
initial
$monitor("%5d: clk=%b,d=%d,z=%d,expect=%d, ok=%d", $time,clk,d,z, e, ok);
initial begin
clk=0;
flag = $value$plusargs("enable=%b", enable);
repeat (20) begin
#2 d = $random;
e=d;
if(e === z)
ok = 1;
else
ok = 0;
end
$finish;
end
endmodule
这是示例输出
0: clk=0,d= x,z= x,expect= x, ok= x
1: clk=1,d= x,z= x,expect= x, ok= x
2: clk=0,d= 303379748,z= x,expect= 303379748, ok= 0
3: clk=1,d= 303379748,z= 303379748,expect= 303379748, ok= 0
4: clk=0,d=3230228097,z= 303379748,expect=3230228097, ok= 0
5: clk=1,d=3230228097,z=3230228097,expect=3230228097, ok= 0
6: clk=0,d=2223298057,z=3230228097,expect=2223298057, ok= 0
7: clk=1,d=2223298057,z=2223298057,expect=2223298057, ok= 0
8: clk=0,d=2985317987,z=2223298057,expect=2985317987, ok= 0
9: clk=1,d=2985317987,z=2985317987,expect=2985317987, ok= 0
10: clk=0,d= 112818957,z=2985317987,expect= 112818957, ok= 0
11: clk=1,d= 112818957,z= 112818957,expect= 112818957, ok= 0
12: clk=0,d=1189058957,z= 112818957,expect=1189058957, ok= 0
13: clk=1,d=1189058957,z=1189058957,expect=1189058957, ok= 0
14: clk=0,d=2999092325,z=1189058957,expect=2999092325, ok= 0
15: clk=1,d=2999092325,z=2999092325,expect=2999092325, ok= 0
16: clk=0,d=2302104082,z=2999092325,expect=2302104082, ok= 0
17: clk=1,d=2302104082,z=2302104082,expect=2302104082, ok= 0
18: clk=0,d= 15983361,z=2302104082,expect= 15983361, ok= 0
19: clk=1,d= 15983361,z= 15983361,expect= 15983361, ok= 0
20: clk=0,d= 114806029,z= 15983361,expect= 114806029, ok= 0
如您所见,它表明其中一些确实具有相同的“z”和“期望”值。但“确定”始终设置为“0”。即使我将其编码为在它们相同时设置为 1。
这个我就不知道了。请帮助我,谢谢。
最佳答案
很难确定,因为您无法提供注册
的代码。不过,我怀疑你的日程安排有问题。 Verilog 有 4 个调度区域:
from prev time step
|
ACTIVE
|
INACTIVE
|
NBA
|
POSTPONED
|
V
to next time step
该行将在 ACTIVE 区域执行:
e=d;
z
可能正在 NBA 地区更新(如果没有代码我无法确定,但如果 register
是一些 D -类型触发器并且已经正确编码,应该是)。
这些行也将在 ACTIVE 区域中执行:
if(e === z)
ok = 1;
else
ok = 0;
so z
此时仍将具有其先前的值。这一行
$monitor("%5d: clk=%b,d=%d,z=%d,expect=%d, ok=%d", $time,clk,d,z, e, ok);
将在 POSTPONED 区域执行,因此此时 z
将获得其新值。
要解决此问题,请尝试将 #1
放在 if(e === z)
之前。这会将比较延迟到下一个时间步,到那时 z
将有时间进行更改。
这是 HDL 的常见情况。在比较输出之前,您需要等待一段短暂但真实的时间,以使实际输出稳定下来。
关于Verilog Oracle,期望值无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36242999/