【问题标题】:Verilog simulation: all outputs xVerilog 模拟:所有输出 x
【发布时间】:2014-05-27 19:08:01
【问题描述】:

当我通过模拟器运行我的模块时,我的输出始终都是 x。

这是我的代码:

module state_machine(
    input clk_i,
    input reset_n,
    input LB,
    input RB,

    output reg [3:0] outputs
        );


        reg [3:0] state;
        reg [3:0] state_n;


        parameter FW = 4'b0101;
        parameter BWL = 4'b0000;
        parameter BWR = 4'b0000;
        parameter SL = 4'b0001;
        parameter SR = 4'b0100;


        always @ (posedge clk_i, negedge reset_n)
            begin
                if(!reset_n)
                    state <= FW;
                else
                    state <= state_n;
            end


        always @ (*)
            begin
                case(state)
                    FW: begin
                            if(!RB)
                                state_n = BWR;
                            else if(!LB)
                                state_n = BWL;
                        end
                    BWL: state_n = SL;
                    BWR: state_n = SR;
                    SL: state_n = FW;
                    SR: state_n = FW;

                    default: state_n = FW;
                endcase
            end


        always @ (*)
            begin
                outputs = state;
            end
endmodule

clk_i 输入是使用计数器方法制作的慢速时钟,此处为:

module clock_counter(
    input clk_i,
    input reset_n,

    output reg clk_o
        );

        reg [19:0] count;

        always @ (posedge clk_i, negedge reset_n)
            begin
                count <= count + 1;
                if(!reset_n)
                    begin
                        clk_o <= 0;
                        count <= 0;
                    end
                else if(count >= 1039999)
                    begin
                        clk_o <= ~clk_o;
                        count <= 0;
                    end
            end

endmodule

它们都由仅执行此操作的顶级模块实例化。我没有收到任何错误,但我确实收到了一些关于某些我不认识的东西被卡在零的警告。

谁能看出哪里出了问题?

这是我的测试平台代码:

    `timescale 1 ns / 1 ns

// Define Module for Test Fixture
module top_module_tf();

// Inputs
    reg reset_n;
    reg LB;
    reg RB;


// Outputs
    wire [3:0] outputs;


// Bidirs


// Instantiate the UUT
// Please check and add your parameters manually
    top_module UUT (
        .reset_n(reset_n), 
        .LB(LB), 
        .RB(RB), 
        .outputs(outputs)
        );


// Initialize Inputs
// You can add your stimulus here
    initial begin
            reset_n = 1; LB = 1; RB = 0;
 #500000000 reset_n = 1; LB = 1; RB = 1;
    end

endmodule // top_module_tf

【问题讨论】:

    标签: verilog hdl


    【解决方案1】:

    您需要在时间 0 将 testbench reset_n 信号设置为 0 以重置您的逻辑。延迟后,您应该将reset_n 设置为 1。

    变化:

            reset_n = 1; LB = 1; RB = 0;
    

    到:

            reset_n = 0; LB = 1; RB = 0;
    

    所有reg 信号默认为X。

    【讨论】:

    • 您好工具,已解决。当你回答时,我正在想如果事情太完美会发生什么。感谢您的帮助,现在可以使用了。
    【解决方案2】:

    使用重置是执行此操作的传统方式,但您也可以为寄存器提供这样的初始值

    reg LB = 1'b0;
    reg RB = 1'b0;
    

    Modelsim 支持这一点,并且 quartus 将合成在启动时加载给定值的 reigster。您也可以在 verilog 2001 端口声明中执行此操作

    module some_module(  
      input wire clk,
      output reg[15:0] counter_val = 16'd12345,
      output wire some_other_signal);
    

    这就是您减少仿真所需的重置代码量的方法。但是,在摆脱重置之前,您需要仔细考虑,例如如果您的寄存器损坏,请确保您的逻辑最终会返回到有效状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多