Reputation: 137
When I run my module through a simulator, my outputs are always all x.
Here is my code:
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
The clk_i input is a slowed clock made using a counter method, which is here:
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
They are both instantiated by a top module which does only that. I don't receive any errors, but I do get a few warnings about certain things I don't recognize being stuck at zero.
Can anyone see what is wrong?
Here is my testbench code:
`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;
// Instantiate the UUT
top_module UUT (
.reset_n(reset_n),
.LB(LB),
.RB(RB),
.outputs(outputs)
);
// Initialize Inputs
initial begin
reset_n = 1; LB = 1; RB = 0;
#500000000 reset_n = 1; LB = 1; RB = 1;
end
endmodule // top_module_tf
Upvotes: 1
Views: 11570
Reputation: 62236
You need to set your testbench reset_n
signal to 0 at time 0 to reset your logic. After a delay, you should set reset_n
to 1.
Change:
reset_n = 1; LB = 1; RB = 0;
to:
reset_n = 0; LB = 1; RB = 0;
All reg
signals default to X.
Upvotes: 0
Reputation: 845
Using a reset is the traditional way to do it, but you could also give registers an initial value like this
reg LB = 1'b0;
reg RB = 1'b0;
Modelsim supports this, and quartus will synthesize reigsters which load the given value at startup. You can also do this in verilog 2001 port declarations
module some_module(
input wire clk,
output reg[15:0] counter_val = 16'd12345,
output wire some_other_signal);
So that is how you cut down on the amount of reset code you need for simulation. You need to think carefully before you get rid of resets though, e.g. make sure your logic will eventually roll around to valid states if your registers get corrupted.
Upvotes: -1