为什么我的Verilog输出寄存器仅输出“ x”?

时间:2019-03-20 03:20:45

标签: output verilog

我编写了以下模块,以接收12位输入流,并通过Exponential Moving Average (EMA)公式运行它。模拟程序时,好像我的输出是12位的“无关”流。无论我的输入是什么,输出寄存器都无法实现。

我是Verilog的初学者,所以我确定这里有很多问题,但是我希望至少能得到一些输出。为什么会发生这种现象?将来如何解决?我在本文的底部链接了波形结果的屏幕截图。

我的verilog模块:

`timescale 1ns / 1ps
module EMATesting (     input signed [11:0] signal_in,
                        output reg signed [11:0] signal_out,
                        input clock_in,
                        input reset,
                        input enable,
                        output reg [11:0] newEMA);

reg [11:0] prevEMA;
reg [11:0] y;
reg [11:0] temp;
integer count = 0;
integer t = 1;
integer one = 1;
integer alpha = 0.5;

always @(posedge clock_in) begin

    if (reset) begin
        count = 0;
        end

    else if (count < 64) begin
         count = count + 1;
        end

//set the output equal to the first value received
    if (count == 1) begin
        newEMA = signal_in;
        end

//if not the first value, run through the formula
    else begin
        temp = newEMA;
        prevEMA = temp;
        newEMA = alpha * signal_in + (one-alpha) * prevEMA;
        count = count + 1;
        end
    end
endmodule

我的verilog测试平台:

`timescale 10ns / 1ns
module testbench_EMA;

reg signal_in;
reg clock_in, reset, enable;
wire [11:0] signal_out;
wire [11:0] newEMA;

initial begin
    signal_in = 0; reset = 0; enable = 0;
    clock_in = 0;
end

EMATesting DUT(signal_in, signal_out, clock_in, reset, enable, newEMA);

initial
begin
//test some values with timing intervals here 
#100;
reset = 1;
#100;
reset = 0;
enable = 1;
#100;
//set signal_in to "1" repeating 12 times
signal_in = { 12 { 1'b1}};
#100;
reset = 1;
#100; //buffer to end simulation
$finish;
end


always
    #5 clock_in = !clock_in;

endmodule

Waveform results of my testbench。请注意,两个输出寄存器都没有给出值。

1 个答案:

答案 0 :(得分:2)

您的代码中有很多错误。 @先生。 Snrub列出了其中的一些。您可以更正注释中列出的错误,并通过进一步编辑代码来使其按需运行,但是还有更重要的基本问题。您必须先解决这些问题,然后再进行进一步的错误调试,再加上以后很难调试的错误,这还具有更好地理解HDL概念的优势。

  • 首先,您需要了解软件编程语言和硬件描述语言之间的区别。您应该为此做进一步的研究,您所犯的错误通常是由假定HDL与软件编程语言相似的开发人员犯的。检查this链接以获取更多信息。
  • 您需要进一步了解Verilog HDL(或任何其他HDL)代码是如何合成的以及为什么使用它们。
  • 需要熟悉何时以及如何使用阻塞=或非阻塞<=分配以及它们如何工作。检查this链接。

在研究列出的主题时,您将了解,在边缘敏感(同步或顺序)always块中,使用阻塞=分配是个坏主意。

使用阻塞分配时,分配是按顺序完成的,就像常见的软件编程语言一样。对于边缘敏感的always块,您只有非常有限的时间来完成always块内的所有必需分配。

在您的情况下,由于边缘敏感区域中的所有分配始终处于阻塞状态(假设没有重置条件):

  • 首先,它检查count是否小于64,并在这种情况下完成分配。所有其他作业都在等待该作业完成。
  • 在第一次分配完成时,敏感度为always的{​​{1}}块可能已经结束执行并等待时钟的下一个沿。因此,其他分配未完成。
  • 由于您尚未初始化输出寄存器,因此它们最初填充了“无关紧要”且不再分配新值,因此,您得到了该输出(填充了“无关紧要” )。
  • 即使posedge clock_in大于或等于64,在将值分配给count之前,您还有其他阻塞分配。