Verilog案例陈述始终为真

时间:2019-07-17 04:07:34

标签: case verilog

Verilog案例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;

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

但是如果我执行此操作,LED将亮起,模式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

不了解案例陈述在verilog中如何工作

1 个答案:

答案 0 :(得分:0)

我相信您会跳过Verilog仿真,并将代码直接加载到FPGA。

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