[英]Verilog case statement is always true
Verilog案例statmenet表达式始终为true
module test(input clk,
input reset,
output reg[3:0] ledss
);
reg[31:0] dataread;
always @(posedge clk)
begin
case(dataread)
32'b1010101010101010101:ledss='b1010;
endcase
end
endmodule
不明白为什么执行这条线
32'b1010101010101010101:ledss='b1010;
LED处于相同模式1010
同样在执行此代码后,LED不亮
module test(input clk,
input reset,
output reg[3:0] ledss
);
reg[31:0] dataread;
always @(posedge clk)
begin
if(dataread==32'b1010101010101010101) ledss='b1010;
end
endmodule
但是,如果我执行此操作,指示灯将亮起,模式1010
module test(input clk,
input reset,
output reg[3:0] ledss
);
reg[31:0] dataread;
always @(posedge clk)
begin
case(dataread)
32'b101010101010:
begin
if(dataread==32'b101010101010) ledss='b1010;
end
endcase
end
endmodule
不了解case语句在verilog中如何工作
我相信您正在跳过Verilog仿真,而是直接将代码加载到FPGA。
在模拟中。 直到满足模式匹配(无论是case
还是if
), ledss
都是X。 在提供的代码中,永远不会分配dataread
,因此它将是X,因此在模拟ledss
中将始终是X。在pastebin链接中,数据dataread
是由ROM输出驱动的,因此它将有一个与检查条件匹配的已知输出。
FPGA合成您的RTL,通常会进行一些优化。 ledss
没有显式初始化,并且只有一个可能的值(如果已分配)。 因此,优化器可能会认为初始值无关紧要,然后通过选择初始值与可以分配给它的唯一可能值相同来简化逻辑。 或者可以假定初始值为0并保留逻辑。 通常,对于这种情况, case
倾向于遵循前者, if
倾向于遵循后者。 尽管您的代码在功能上是等效的,但只包含一个条件的案例陈述并不常见。
我建议您改善编码风格,以便合成器和任何阅读您的代码的人都能更清楚地理解您的预期行为。 波纹管是一些建议。 请记住将数据dataread
分配给一个已知值。 (注:代替32'b1010101010101010101
用等价32'h0005_5555
易读性)
always @(posedge clk)
begin
case(dataread)
32'h0005_5555 : ledss <= 4'b1010;
default : ledss <= 4'b1111;
endcase
end
或同等学历:
always @(posedge clk)
begin
if (dataread == 32'h0005_5555)
ledss <= 4'b1010;
else
ledss <= 4'b1111;
end
如果您希望ledss
在分配后保持1010模式,则可以执行以下操作:
always @(posedge clk)
begin
if (reset) begin
ledss <= 4'b1111;
end
case(dataread)
32'h0005_5555 : ledss <= 4'b1010;
endcase
end
或同等学历:
always @(posedge clk)
begin
if (reset) begin
ledss <= 4'b1111;
end
else if (dataread == 32'h0005_5555) begin
ledss <= 4'b1010;
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.