Verilog case 语句始终为真
Verilog case statement is always true
Verilog case statmenet 表达式始终为真
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;
leds 在相同的模式 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
但是如果我执行这个,leds 会亮起,模式 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。
模拟中。 ledss
将是 X,直到满足模式匹配(case
或 if
)。在提供的代码中,dataread
从未分配,因此它将是 X,因此在模拟中 ledss
将始终是 X。在您的 pastebin 链接中,您有 dataread
由 ROM 输出驱动,因此它将有一个可能符合检查条件的已知输出。
FPGA 综合您的 RTL,通常会进行一些优化。 ledss
没有被显式初始化并且只有一个可能的值(如果曾经分配过的话)。因此,优化器可能会假设初始值是无关紧要的,然后通过将初始值选择为与它可以分配给的唯一可能值相同来简化逻辑。或者它可能假定初始值为 0 并保持逻辑。对于这种情况,一般来说,case
倾向于前者而if
倾向于后者。尽管您的代码在功能上是等效的,但只有一个条件的 case-statement 并不常见。
我建议您改进编码风格,以便合成器和阅读您代码的任何人都能更明确地理解您的预期行为。下面是一些建议。请记住将 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
Verilog case statmenet 表达式始终为真
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;
leds 在相同的模式 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
但是如果我执行这个,leds 会亮起,模式 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。
模拟中。 ledss
将是 X,直到满足模式匹配(case
或 if
)。在提供的代码中,dataread
从未分配,因此它将是 X,因此在模拟中 ledss
将始终是 X。在您的 pastebin 链接中,您有 dataread
由 ROM 输出驱动,因此它将有一个可能符合检查条件的已知输出。
FPGA 综合您的 RTL,通常会进行一些优化。 ledss
没有被显式初始化并且只有一个可能的值(如果曾经分配过的话)。因此,优化器可能会假设初始值是无关紧要的,然后通过将初始值选择为与它可以分配给的唯一可能值相同来简化逻辑。或者它可能假定初始值为 0 并保持逻辑。对于这种情况,一般来说,case
倾向于前者而if
倾向于后者。尽管您的代码在功能上是等效的,但只有一个条件的 case-statement 并不常见。
我建议您改进编码风格,以便合成器和阅读您代码的任何人都能更明确地理解您的预期行为。下面是一些建议。请记住将 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