我遇到了一些实现可合成状态机的问题,以便从我已经实现的几个较低级别的模块输出结果。据我所知,到目前为止我所拥有的结构需要嵌套的始终块,但这在Verilog中无法完成。我不知道如何规避这个问题。
编辑:由于至少有一位同学已将我自己的代码中的相同(且无功能,lol)部分转换为代码而被删除。
答案 0 :(得分:1)
如果您认为需要嵌套的始终块,那么您可能不会考虑硬件设计,而RTL会从电子组件中抽象出一些必须编写的抽象来代表可能的硬件行为。
always @*
表示组合块
always @(posdege clk)
表示顺序逻辑,其中输出由触发器驱动。
总是阻止告诉模拟器何时触发模拟块,因为一切都在同时发生,它是全部并行的。模拟器无法知道何时安排这些块中未包含的代码。
您需要always @(posedge KEY[0]
和always @(posedge KEY[1]
,其中每个都包含case语句。如果他们不为特定情况做任何事情,则保持或清零当前值。您可以将default:
案例作为未指定的所有案例。
<强>更新强>
关于旋转功能,您应该能够使MSB指示是否为负。
使用>>>
保留符号位。您可能需要声明已分配的reg / wire或添加$ signed function
reg signed [msb:0] data_in;
always @(posedge clk) begin
if (data_in[msb] == 1'b0) begin
data_out <= data_in <<< 1;
end
else begin
data_out <= data_in >>> 1;
end
end
// or use $signed(data_in) >>> 1;
答案 1 :(得分:0)
您似乎拥有initial
块内的所有内容,因此寻找posedge
甚至没有意义。通常,initial
块不可合成。
不,你不能嵌套always
块,你不应该这样做。
您应该只有一个always @(posedge KEY[1])
,其中包含STATE
的所有可能分配。您无法在不同的reg
块中对相同的always
进行分配。请务必使用非阻止分配。
为其他always
信号创建其他reg
块,理想情况下每个信号使用一个always
块。