In the following code, I am storing the history of buttons player 1 and player 2 pressed. The code compiles without errors but has warnings. I am unable to solve these warnings. I am posting the code here.
module game(clk50,red,green,blue,hsync,vsync, button,led);
input [8:0] button;
input clk50;
output red;
output green;
output blue,led;
output hsync;
output vsync;
// divide input clock by two, and use a global
// clock buffer for the derived clock
reg clk25_int;
always @(posedge clk50) begin
clk25_int <= ~clk25_int;
end
wire clk25;
BUFG bufg_inst(clk25, clk25_int);
wire [9:0] xpos;
wire [9:0] ypos;
Grid_Display Grid_Displayinst(clk25,xpos, ypos, red, green, blue, button,led);
endmodule
module Grid_Display(clk25,xpos,ypos,red,green,blue, button,led);
input clk25;
input [9:0] xpos;//responsible for current pixel display location
input [9:0] ypos;// responsible for current display row
input [8:0] button;
//spartan 3 kit has 3-bits per pixel, so 2^3 means 8 colours can be selected.
output red; // colour 1
output green; // colour 2
output blue; // colur 3
output led;
//reg tempRed,tempGreen,tempBlue, GridRed,GridGreen,GridBlue;
reg player1,player2;
reg [8:0] player1History=0,player2History=0;
wire grid = ((xpos >= 4 && xpos <= 799 && ypos >= 160 && ypos <= 165) ||
(xpos >= 4 && xpos <= 790 && ypos >= 310 && ypos <= 315) ||
(xpos >= 200 && xpos <= 205 && ypos >= 0 && ypos <= 520) ||
(xpos >= 440 && xpos <= 445 && ypos >= 0 && ypos <= 520));
always @(posedge clk25)
begin
player1History= button ^ player2History;
player2History= button ^ player1History;
player1 = ((player1History[0] && (xpos >=50 && xpos<=150 && ypos >= 20 && ypos <=120) ) || (player1History[1] && (xpos >=250 && xpos<=350 && ypos >= 20 && ypos <=120))
|| (player1History[2] && (xpos >=490 && xpos<=590 && ypos >= 20 && ypos <=120)) || (player1History[3] && (xpos >=50 && xpos<=150 && ypos >= 180 && ypos <=280))
|| (player1History[4] && (xpos >=250 && xpos<=350 && ypos >= 180 && ypos <=280)) || (player1History[5] && (xpos >=490 && xpos<=590 && ypos >= 180 && ypos <=280))
|| (player1History[6] && (xpos >=50 && xpos<=150 && ypos >= 330 && ypos <=430)) || (player1History[7] && (xpos >=250 && xpos<=350 && ypos >= 330 && ypos <=430))
|| (player1History[8] && (xpos >=490 && xpos<=590 && ypos >= 330 && ypos <=430)));
player2 = ((player2History[0] && (xpos >=50 && xpos<=150 && ypos >= 20 && ypos <=120) ) || (player2History[1] && (xpos >=250 && xpos<=350 && ypos >= 20 && ypos <=120))
|| (player2History[2] && (xpos >=490 && xpos<=590 && ypos >= 20 && ypos <=120)) || (player2History[3] && (xpos >=50 && xpos<=150 && ypos >= 180 && ypos <=280))
|| (player2History[4] && (xpos >=250 && xpos<=350 && ypos >= 180 && ypos <=280)) || (player2History[5] && (xpos >=490 && xpos<=590 && ypos >= 180 && ypos <=280))
|| (player2History[6] && (xpos >=50 && xpos<=150 && ypos >= 330 && ypos <=430)) || (player2History[7] && (xpos >=250 && xpos<=350 && ypos >= 330 && ypos <=430))
|| (player2History[8] && (xpos >=490 && xpos<=590 && ypos >= 330 && ypos <=430)));
end
assign red = (grid || player1 );
assign green = (grid || player2);
assign blue = (grid );
endmodule
How can I solve these warnings?
WARNING:Xst:2211 - "grid.v" line 104: Instantiating black box module <dummyModule>.
WARNING:Xst:1710 - FF/Latch <player2> (without init value) has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_0> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_1> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_2> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_3> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_4> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_5> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_6> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_7> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_8> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2036 - Inserting OBUF on port <led> driven by black box <dummyModule>. Possible simulation mismatch.
Regards
All your warnings about FF/Latch trimming basically boil down to the issue that player2History is always 0, and as such it is being optimized out.
It wouldn't look like it should always be 0, but it turns out to be true due to an interesting side effect of the fact that you used the wrong type of blocking statements.
The issue is in these two lines in your always block:
always @(posedge clk25) begin
player1History= button ^ player2History;
player2History= button ^ player1History;
Your logic then evaluates like this:
p1h = button ^ 0
just means that p1h gets assigned the value of button. button ^ p1h
, but since we just assigned p1h = button
, you're really evaluating button ^ button
, which we know is always 0.What you probably meant to do was to make p1h and p2h non- blocking assignments, with the <=
operator. When you use nonblocking it means that both statements are evaulated in parallel, so both p1h and p2h are evaluated against their old values, instead of first computing the first line, and then using this result in the second line.
Understanding the difference between blocking and non-blocking statements is very important in verilog, and if you don't understand the concept or when to use them, then you should seek additional training materials.