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,直到满足模式匹配(caseif)。在提供的代码中,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