【发布时间】:2014-02-04 02:20:13
【问题描述】:
关于循环寄存器的问题:
代码:
reg [7:0] value1;
reg [7:0] value2;
value1 = 50;
value2 = value1 - 255;
问题:
value2=0 还是 value2=205 ??
【问题讨论】:
标签: verilog
关于循环寄存器的问题:
代码:
reg [7:0] value1;
reg [7:0] value2;
value1 = 50;
value2 = value1 - 255;
问题:
value2=0 还是 value2=205 ??
【问题讨论】:
标签: verilog
这取决于...
reg [7:0] value1;
reg [7:0] value2;
always @* begin
value1 = 50;
value2 = value1 - 255;
end
value2 将是 205。第二个阻塞赋值发生在第一个阻塞赋值之后,因此当 value2 被赋值时,value1 已经有一个已知值 (50)。
reg [7:0] value1;
reg [7:0] value2;
always @(posedge clk) begin
value1 <= 50;
value2 <= value1 - 255;
end
value2 在第二个 clk 上升沿后为 205。这两个任务都是非阻塞的。在第一个上升沿之后(第一次评估always)value1 为50,而value2 未确定,因为它与value1 同时分配,而当时value1 有还不是一个已知的值。
在第二个时钟上升沿之后,value1 不会改变(再次分配为 50),value2 得到 205,因为它是使用之前的值 value1 评估的,已经是 50。
【讨论】:
既不是 0,也不是 205,而是 51!
value1 和 value2 都是无符号的,因此结果也应该是无符号的:
值1 = 00110010,-255 = (11111111111111111111111100000001)_base2,值2 = (00110011)_base2 = (51)_base10
这里是my test module:
module test;
reg [7:0] value1;
reg [7:0] value2;
initial begin
value1 = 50;
value2 = value1 - 255;
$display ("Value1 = %b, -255 = (%b)_base2, value2 = (%b)_base2 = (%d)_base10", value1, -255, value2, value2);
end
endmodule
【讨论】:
logic 不是 Verilog 支持的数据类型。此问题尚未被Systemverilog 标记。