#一. 问题现象
当output为wire型时,利用assign对c进行赋值,综合结束后没有报错;
module mux2(
input a,
input b,
input sys_clk,
input sel,
output c
);
assign c=(sel==1)?a:b;
endmodule
当output为reg型时,利用assign对c进行赋值,综合结束后有报错:[Synth 8-1852] concurrent assignment to a non-net c is not permitted;
module mux2(
input a,
input b,
input sys_clk,
input sel,
output reg c
);
assign c=(sel==1)?a:b;
endmodule
当output为reg型时,在always中对c进行赋值,综合结束后没有报错;
module mux2(
input a,
input b,
input sys_clk,
input sel,
output reg c
);
always@(posedge sys_clk)
begin
c=(sel==1)?a:b;
end
endmodule
当output为wire型时,在always中对c进行赋值,综合结束后报错,[Synth 8-2576] procedural assignment to a non-register c is not permitted;
module mux2(
input a,
input b,
input sys_clk,
input sel,
output wire c
);
always@(posedge sys_clk)
begin
c=(sel==1)?a:b;
end
endmodule
#二. 问题现象分析
a) 根据报错信息分析,是因为reg和wire 与 always和assign没有匹配正确;
b) 根据查找资料总结:https://blog.youkuaiyun.com/u013025203/article/details/53410715
Wire型变量一般综合结果为一根导线,对应于连续赋值,即在赋值语句中右边变量发生变化时,左边的值随之发生变化;连续赋值需要在assign中
Reg型变量在always中有两种情况:1.检测电平,即不带时钟边沿检测,综合出来还是组合逻辑;2.检测上升沿或者下降沿,综合出来为时序逻辑;该reg对应于过程赋值,即右边的变量发生变化时,左边的值不会立刻发生变化,一般需要等待下一个周期;过程赋值需要在always或initial中;