很奇怪的一个问题
对于下面这段代码,addr - pre_addr = 6’h10,这个执行结果没问题,但是条件判断这里,会判断为addr-pre_addr > 62,执行结果如下
`timescale 1ns/1ns
module test ();
reg [5:0] addr;
reg [5:0] pre_addr;
reg [5:0] rest;
initial begin
addr = 6'b0;
pre_addr = 6'b11_0000;
rest = addr - pre_addr;
// if(rest[5:0] > 62) begin
if(((addr - pre_addr) > 62) & 1 ) begin
$display("rest = %h > 62",addr - pre_addr);
end
else begin
$display("rest = %h < 62",addr - pre_addr);
end
#10;
$finish();
end
endmodule
执行结果
如何获得正确结果?
方法
将addr-pre_addr先进行组合逻辑运算,再将结果代入表达式中,如下
`timescale 1ns/1ns
module test ();
reg [5:0] addr;
reg [5:0] pre_addr;
reg [5:0] rest;
initial begin
addr = 6'b0;
pre_addr = 6'b11_0000;
rest = addr - pre_addr;
// if(rest[5:0] > 62) begin
if((rest > 62) & 1 ) begin
$display("rest = %h > 62",addr - pre_addr);
end
else begin
$display("rest = %h < 62",addr - pre_addr);
end
#10;
$finish();
end
endmodule
运行结果如下
错误的解决方法
将整个条件判断表达式都写在if条件之外提前运算,这样也是得不到正确的结果。
`timescale 1ns/1ns
module test ();
reg [5:0] addr;
reg [5:0] pre_addr;
reg [5:0] rest;
reg true_or_false;
initial begin
addr = 6'b0;
pre_addr = 6'b11_0000;
true_or_false = ((addr - pre_addr) > 62) & 1;
// if(rest[5:0] > 62) begin
// if((rest > 62) & 1 ) begin
if(true_or_false) begin
$display("rest = %h > 62",addr - pre_addr);
end
else begin
$display("rest = %h < 62",addr - pre_addr);
end
#10;
$finish();
end
endmodule