verilog里always下第一个 if 语句里面的变量为什么一定要是always里的敏感变量呢

2024-11-18 07:23:45
推荐回答(4个)
回答(1):

verilog不是软件语言,不是用来像C一样编程序的,而是用来描述某一种硬件的。你的“always @ (posedge clk , negedge A)”应该写成“always @ (posedge clk or negedge A)”,正规的写法是“always @ (posedge clk or negedge rst_n)”,这表明你要描述一个上升沿触发的D触发器,并且是异步复位的,复位信号低有效。verilog描述的东西最终要送到工厂去做成实实在在的东西,不是像C一样编译以后成为机器语言指挥CPU运行。即使你写的verilog符合语法要求,但如果你描述的是一个在人家工厂里的工艺库里不存在的东西,人家也做不出来。

回答(2):

兄弟,

依我看来,这种code是不应该出现的,在现在SOC盛行的年代,写verilog都会讲求标准化.
我会建议您写法如下.

a. 先想想你要的是DFF, or logic gate.
b. 如果是DFF, 想想是要async. reset, or sync. reset.
c. 如果要async. reset, 写法如下
always@(posedge clk or negedge rst_n)
if(!rst_n) ...
else
d. 如果要sync. reset, 写法如下
always@(posedge clk)
if(!rst_n)...
else ...
e. 如果要 logic gate,写法如下.
always@(*)
...

另外,您的取名方式很容易让读code的人造成混淆,您可以考虑取清楚点.

小弟曾在全球大型IC Design house干了不少年,虽称不上高手,
但有机会看到许多高手写的code,
这是给您的建议,希望对您有帮助

Thanks.

回答(3):

A相当于一个异步复位信号,在优先级上当然大于普通电平触发信号。建议你不用把A放到敏感列表里。

回答(4):

最好不要把A最为if的执行条件,如果想复位可以进行if(!rset) 判断
比如if(!rset)
begin
....
end
else begin
...
end