Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog Oracle,预期值不为';我不能正常工作_Verilog_System Verilog_Iverilog - Fatal编程技术网

Verilog Oracle,预期值不为';我不能正常工作

Verilog Oracle,预期值不为';我不能正常工作,verilog,system-verilog,iverilog,Verilog,System Verilog,Iverilog,我正在修复下面的一些源代码问题。 我正在创建一个比较预期价值和实际价值的oracle。 我试图计算的期望值是变量“e”。 我得到的实际值是变量“z” 因此,当'e==z'时,变量'ok'应该是'1'。但即使“e==z”为真,它也不会将“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, ena

我正在修复下面的一些源代码问题。 我正在创建一个比较预期价值和实际价值的oracle。 我试图计算的期望值是变量“e”。 我得到的实际值是变量“z”

因此,当'e==z'时,变量'ok'应该是'1'。但即使“e==z”为真,它也不会将“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”和“expect”值。但“ok”始终设置为“0”。即使我将其编码为,当它们相同时,其行为设置为1


这是我不知道的。请帮助我,谢谢。

很难确定,因为您无法提供注册的代码。但是,我怀疑您的日程安排有问题。Verilog有4个调度区域:

该行将在活动区域中执行:

e=d; 
if(e === z)
  ok = 1;
  else
ok = 0;
z
可能正在NBA地区进行更新(如果没有代码,我不能确定,但是如果
register
是一些D型触发器,并且已经正确编码,它应该是)

这些行也将在活动区域中执行:

e=d; 
if(e === z)
  ok = 1;
  else
ok = 0;
因此,
z
在该点仍将保留其先前的值。这条线

$monitor("%5d: clk=%b,d=%d,z=%d,expect=%d, ok=%d", $time,clk,d,z, e, ok); 
将在延迟区域中执行,因此此时
z
将具有其新值

要解决这个问题,如果(e==z),尝试将
#1
放在
之前。这会将比较延迟到下一个时间步,此时时间
z
将有时间更改

这是HDL的常见情况。在比较输出之前,您需要等待一些短暂但实时的时间,以允许实际输出得到解决