我的代码如下,以verilog编写 问题是,我想在一个始终块中更改一个名为PC的reg 我需要在多个Always Block中处理这个问题。如果我这样做,我会得到多个驱动器错误,这是有道理的 所以我试着在敏感性列表中添加一些其他变量 但是我得到了这个错误:
合成不支持多个单边下的赋值。
我无法改变代码的结构。 请给我一个解决方案 代码:
always@( posedge clk or posedge PC_SRC or posedge PC_Jmp)
begin
if( clk == 1 )
begin
PC = PC + 1 ;
end
if( PC_SRC == 1 )
begin
PC = PC + Branch_PC ;
end
if( PC_Jmp == 1)
begin
PC = Branch_PC ;
end
end
答案 0 :(得分:0)
您在敏感度列表中不需要posedge PC_SRC or posedge PC_Jmp
。只需保留@posedge clk
并将所有分配放在第一个开始结束块内的PC中。
@posedge
被合成为需要时钟的翻转翻转。有三个@posedge
意味着一个对三个不同时钟敏感的翻牌,你的综合工具不支持。
答案 1 :(得分:0)
通过同步设计,您可以获得一个边沿触发时钟信号。根据您的综合库,一个或两个异步控制引脚(posedge
被映射到高电平有效,negedge
被映射到低电平有效。异步控制引脚由合成器通过在always块中使用来识别,并且可以用于将变量分配给常量。请注意,永远不应在始终块中引用同步时钟信号。
要合成,reg
只能在一个总块内分配。
应使用非阻止分配(<=
)进行同步分配,而不是阻止分配(=
)。在组合块中使用阻塞分配(always @*
)。使用适当的分配类型将阻止RTL仿真竞争条件和模拟RTL-vs-gate行为差异。
您的代码应如下所示:
always @( posedge clk )
begin
if ( PC_Jmp == 1 )
begin
PC <= Branch_PC ;
end
else if ( PC_SRC == 1 )
begin
PC <= PC + Branch_PC ;
end
else
begin
PC <= PC + 1 ;
end
end