我是Verilog的初学者,我试图让逻辑出现在每个时钟正沿。但是,在同一块中,我需要组合逻辑,因为我正在使用for循环并在for循环中更改寄存器的值。当前,该寄存器的值始终显示为X。是否有办法在顺序块中处理此逻辑?谢谢!
代码:
output reg count;
// ...
always @(posedge clock) begin
integer row;
integer col;
count <= 0;
for (col = 0; col < 4; col = col + 1) begin
if (col == 1)
count <= count + 1;
if (count == 1) begin
//other logic that does not occur because count value = x
end
end
end
答案 0 :(得分:3)
非阻塞分配工作不会立即将值分配给“计数”。取而代之的是,他们将作业推迟到模拟刻度线的结尾。因此,就您而言:
count
的初始值为x
。
count <= 0
中,会在将来的某个时间将其设置为零,但目前仍为x
;
在您的循环中您说count <= count + 1
。但是count
仍然是'x',而count + 1
也是x
。您要求它在将来的某个时间将x
分配给计数,但是在您要求它分配'0'之后。因此,它将在模拟刻度结束时变为“ x”。结果,它将始终为“ x”。
您的if (count == 1)
永远不会正确,因为count
仍然是'x'。
例如,初始化计数的通常方法是产生一个复位信号
always @(posedge clk) begin
if (reset)
count <= 0;
else
for(...)
if (col == 1)
count <= count + 1;
end
您可以在Always块中添加if (count == 1)
,但请记住非阻塞分配的规则,在这种情况下,计数将在一个时钟周期后变为1。根据您的要求,您也许可以将其移动到单独的Always块中。
always @*
if (count == 1) do something
else do something else