verilog设计风格的问题
always@(posedge clk or negedge rst_n)
if(!rst_n)
else
这样写是不是不好,nlint检查时总是报warning说rst_n既是reset信号又是置位信号,如果必须要用复位置数应该怎么写
[attach]446663[/attach]
初看没有问题哦。但是你下面是如何写的很关键了。最好写全。
rst_n==1'b0
rst_n==1'b0?赋值用<=
一般没人会在这里对rst_n赋值吧?rst_n作为复位信号可以在这里直接赋值么?不是太明白
期待高人解答
试过效果是一样的
那个是判断,不是赋值
这两个检查规则没必要启用。
“复位”成0是reset,“复位”成1是set(或称preset)。下面那个报警是指rst_n为低时有些寄存器被置0,有些被置1。
不好意思,看错了,还以为说的是if(!rst_n)
rst_n==1'b0;
没有什么问题,本来就是把它当异步复位信号来使用,只不过是你的复位的值不一定都是0,可能也有1。这些warning不要紧的!
应该不是这个原因引起的
仅是告诉你用了异步复位而已,没什么问题。
在fpga里面,最好采用下列风格描述代码,不知道你在什么环境下编译了。不过我用下面风格描述,没有发现上述问题了。另多句嘴,在fpga里面信号多用高电平为有效,不要用低电平为有效。
always @(posedge clk or posedge rst) begin
if (rst == 1'b1) begin
{ 复位赋值逻辑}
end
else begin
if (......) begin
........
end
else begin
.......
end
end
end
FPGA内部寄存器是异步复位低有效,同步复位高有效。你从ChipPlanner或者PlanAhead点一个寄存器进去看看端口就知道了。
always@(posedge clk )
if(!rst_n)
else
(or negedge rst_n )不需要加上
这个问题不是局部问题,是你在设计里对rst_n信号的使用方法不同,有的用了置位用的用做复位。
alint的log文件里会分两类列出置位复位的触发器,看一下就知道了。
看看333
一楼的写法不仅没有问题,而且是ASIC设计推荐的coding style;
报错检查一下是不是里面的逻辑问题
具体还是要看用的哪个fpga器件:
1.xilinx从6系列开始,内部寄存器的异步复位端口只支持高电平,如果要低电平异步复位,综合器会自动增加一个lut取反再接入寄存器里使用,但是6系列之前是内部寄存器的异步复位端口支持高电平或者低电平的。
2.altera内部寄存器的异步复位端口一直支持高电平或者低电平的。
