Verilog 无法在模拟器中找到错误,因为$display&;模拟器的波形窗口显示不同的结果?

Verilog 无法在模拟器中找到错误,因为$display&;模拟器的波形窗口显示不同的结果?,verilog,fpga,system-verilog,hdl,Verilog,Fpga,System Verilog,Hdl,我试图为乘法器设计一个内建自测试系统(BIST)。我创建了一个运行良好的乘数,现在我尝试将其结果(乘数的输出)与正确的结果(ORA的输出)进行比较。我正在用Modelsim的模拟器进行模拟。我不明白为什么波形显示的结果与$display任务不同。。。。。。。我现在一片空白,不知道该怎么办……帮帮我吧 这是我的代码(顶级模块)---- 这是我的另一个计数器文件(我把它命名为sender.v)- 由于我没有10个声誉,我无法发布图像,请在您的Modelsim中检查此项… 这里是转录本窗口的输出,显示

我试图为乘法器设计一个内建自测试系统(BIST)。我创建了一个运行良好的乘数,现在我尝试将其结果(乘数的输出)与正确的结果(ORA的输出)进行比较。我正在用Modelsim的模拟器进行模拟。我不明白为什么波形显示的结果与
$display
任务不同。。。。。。。我现在一片空白,不知道该怎么办……帮帮我吧

这是我的代码(顶级模块)----

这是我的另一个计数器文件(我把它命名为sender.v)-

由于我没有10个声誉,我无法发布图像,请在您的Modelsim中检查此项…

这里是转录本窗口的输出,显示不同的结果-

# X=0100 & Y=0001
# hold=00000100
# outb=00000000

波形显示每个时间步结束时的值。对
$display
的调用将在调度程序时间步的活动事件区域执行,其中可能发生以下情况:

  • 执行所有模块阻塞分配
  • 评估所有非阻塞分配和计划更新的右侧(RHS) 进入NBA区域
  • 执行所有模块连续分配
  • 评估Verilog原语的输入并更新其输出
  • 执行$display和$finish命令
由于这些事件的安排顺序未知,您可能会看到不同的结果。波形将显示所有这些事件运行后发生的情况。更多信息来自:

根据verilog的调度语义,
$display
在非阻塞语句更新LHS之前执行。因此,如果$display包含非阻塞赋值的LHS变量,则结果不正确。
$strobe
命令在所有其他命令(包括非阻塞分配)完成后,在时间步长结束时显示更新的值


我建议编写一个单独的自检测试台,而不是依靠
$display
调用来检查您的功能。还请注意,您可以在上共享代码示例(带有波形)。

波形显示每个时间步结束时的值。对
$display
的调用将在调度程序时间步的活动事件区域执行,其中可能发生以下情况:

  • 执行所有模块阻塞分配
  • 评估所有非阻塞分配和计划更新的右侧(RHS) 进入NBA区域
  • 执行所有模块连续分配
  • 评估Verilog原语的输入并更新其输出
  • 执行$display和$finish命令
由于这些事件的安排顺序未知,您可能会看到不同的结果。波形将显示所有这些事件运行后发生的情况。更多信息来自:

根据verilog的调度语义,
$display
在非阻塞语句更新LHS之前执行。因此,如果$display包含非阻塞赋值的LHS变量,则结果不正确。
$strobe
命令在所有其他命令(包括非阻塞分配)完成后,在时间步长结束时显示更新的值


我建议编写一个单独的自检测试台,而不是依靠
$display
调用来检查您的功能。还请注意,您可以在上共享代码示例(带有波形)。

波形显示每个时间步结束时的值。对
$display
的调用将在调度程序时间步的活动事件区域执行,其中可能发生以下情况:

  • 执行所有模块阻塞分配
  • 评估所有非阻塞分配和计划更新的右侧(RHS) 进入NBA区域
  • 执行所有模块连续分配
  • 评估Verilog原语的输入并更新其输出
  • 执行$display和$finish命令
由于这些事件的安排顺序未知,您可能会看到不同的结果。波形将显示所有这些事件运行后发生的情况。更多信息来自:

根据verilog的调度语义,
$display
在非阻塞语句更新LHS之前执行。因此,如果$display包含非阻塞赋值的LHS变量,则结果不正确。
$strobe
命令在所有其他命令(包括非阻塞分配)完成后,在时间步长结束时显示更新的值


我建议编写一个单独的自检测试台,而不是依靠
$display
调用来检查您的功能。还请注意,您可以在上共享代码示例(带有波形)。

波形显示每个时间步结束时的值。对
$display
的调用将在调度程序时间步的活动事件区域执行,其中可能发生以下情况:

  • 执行所有模块阻塞分配
  • 评估所有非阻塞分配和计划更新的右侧(RHS) 进入NBA区域
  • 执行所有模块连续分配
  • 评估Verilog原语的输入并更新其输出
  • 执行$display和$finish命令
由于这些事件的安排顺序未知,您可能会看到不同的结果。波形将显示所有这些事件运行后发生的情况。更多信息来自:

根据verilog的调度语义,
$display
在非阻塞语句更新LHS之前执行。因此,如果$display包含非阻塞赋值的LHS变量,则结果不正确。
$strobe
命令显示更新的val
`timescale 1ns / 1ps

module sender(input wire clkin, output reg clkout);
 reg [2:0]tmp=3'b000;

//Delay Generation////////

always@(posedge clkin)
 begin 
  tmp <= tmp+1'b1;
  clkout<=tmp[2];
 end
endmodule
module braun(x,y,out);
input wire [3:0]x;
input wire [3:0]y; //Input/Output Port Declarations
output [7:0]out;
wire [5:0]a;
wire [8:0]b;
wire [5:0]sa;
wire [1:0]cc;
//If we place 1'b0 in place of "zero"then this was not work so we use this...
wire k[8:0];

//There are 16 And Gates used here....
and a1(out[0],x[0],y[0]);
and a2(a[0],x[1],y[0]);
and a3(a[1],x[2],y[0]);
and a4(a[2],x[3],y[0]); 
and a5(b[0],x[0],y[1]);
and a6(b[1],x[1],y[1]);
and a7(b[2],x[2],y[1]);
and a8(a[3],x[3],y[1]);
and a9(b[3],x[0],y[2]);
and a10(b[4],x[1],y[2]);
and a11(b[5],x[2],y[2]);
and a12(a[4],x[3],y[2]);
and a13(b[6],x[0],y[3]);
and a14(b[7],x[1],y[3]);
and a15(b[8],x[2],y[3]);
and a16(a[5],x[3],y[3]);

//There are 12 Full Adder used here....
full_adder f1(out[1],k[0],a[0],b[0],1'b0);
full_adder f2(sa[0],k[1],a[1],b[1],1'b0);
full_adder f3(sa[1],k[2],a[2],b[2],1'b0);
full_adder f4(out[2],k[3],sa[0],b[3],k[0]);
full_adder f5(sa[2],k[4],sa[1],b[4],k[1]);
full_adder f6(sa[3],k[5],a[3],b[5],k[2]);
full_adder f7(out[3],k[6],sa[2],b[6],k[3]);
full_adder f8(sa[4],k[7],sa[3],b[7],k[4]);
full_adder f9(sa[5],k[8],a[4],b[8],k[5]);
full_adder f10(out[4],cc[0],sa[4],k[6],1'b0);
full_adder f11(out[5],cc[1],sa[5],k[7],cc[0]);
full_adder f12(out[6],out[7],a[5],k[8],cc[1]);

endmodule

module full_adder(output reg sum,output reg carry,input wire a,input wire b,input wire c);

always@(a,b,c)
begin
  case({a,b,c})
    3'b000:begin
             sum=1'b0;
             carry=1'b0;
           end
    3'b001:begin
             sum=1'b1;
             carry=1'b0;
           end
    3'b010:begin
             sum=1'b1;
             carry=1'b0;
           end
    3'b011:begin
             sum=1'b0;
             carry=1'b1;
           end
    3'b100:begin
             sum=1'b1;
             carry=1'b0;
           end
    3'b110:begin
             sum=1'b0;
             carry=1'b1;
           end
    3'b111:begin
             sum=1'b1;
             carry=1'b1;
            end
    3'b101:begin
             sum=1'b0;
             carry=1'b1;
           end
  endcase
end

endmodule
# X=0100 & Y=0001
# hold=00000100
# outb=00000000