微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog设计风格的问题

verilog设计风格的问题

时间:10-02 整理:3721RD 点击:

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内部寄存器的异步复位端口一直支持高电平或者低电平的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top