verilog高手看看我的reg变量判断为啥第二种写法编译报错呢?

2020-01-26 17:30发布

  1.   reg [31:0]Count;
  2.   //写法1:正确
  3.   always@(posedge sys_clk50,negedge rst_n) begin
  4.     if(!rst_n) begin
  5.       Count <=32'd0;
  6.     end
  7.     else begin
  8.       Count <=Count+1;
  9.       if(Count >= 5000) begin //写法正确
  10.         Count <=0;
  11.       end
  12.     end
  13.   end
  14.   
  15.   //写法2:编译报错
  16.   always@(posedge sys_clk50,negedge rst_n) begin
  17.     if(!rst_n) begin
  18.       Count <=32'd0;
  19.     end
  20.     else begin
  21.       Count <=Count+1;
  22.     end
  23.     //-------------------------编译报错
  24.     if(Count >= 5000) begin
  25.       Count <=0;
  26.     end
  27.   end
复制代码

verilog刚学,,不太明白,报错的提示也不理解,谢谢先
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
GavinZ
1楼-- · 2020-01-28 19:02
 精彩回答 2  元偷偷看……
GavinZ
2楼-- · 2020-01-28 23:50
本帖最后由 GavinZ 于 2019-12-3 09:03 编辑
xiaochunyuan 发表于 2019-9-17 16:12
不对,应该是你的和他的第一种是一样的,都对,只是表达方式不同

别用那种方式了。那是不对的。编译器再聪明,你还得理解语言造成的行为后再写出明确无歧义的编码才行。
GavinZ
3楼-- · 2020-01-29 03:55
(⊙o⊙)你 发表于 2019-9-18 14:02
嗯,我的第一种和他的写法的效果是一样的,刚才仿真了,波形和rtl图都一样,但是我的那个写法不建议写, ...

你怎么老提顺序执行,这不是基于MCU的C语言。
fpga就是一堆寄存器加组合逻辑,是基于当前执行下一个clock。一个对象是顺序的;多个对象之间是并行的。

      Count <=Count+1;
      if(Count >= 5000) begin //写法正确
        Count <=0;
      end

看看你这个,当count==5000时, Count <=Count+1;和 Count <=0;同时被执行,你到底是想加1 ? 还是 置0 呢?
明显存在歧义,如果不是综合工具够聪明,你这就是自造麻烦。你应该先弄清楚语言的含义,就不会写出不合实际的代码了。
ycwjh2002
4楼-- · 2020-01-29 09:01
GavinZ 发表于 2019-10-1 22:59
你怎么老提顺序执行,这不是基于MCU的C语言。
fpga就是一堆寄存器加组合逻辑,是基于当前执行下一个clock ...

没有深刻理解非阻塞赋值。 这样写虽然不推荐,实际上逻辑上是正确的。
ycwjh2002
5楼-- · 2020-01-29 09:58
(⊙o⊙)你 发表于 2019-9-18 14:02
嗯,我的第一种和他的写法的效果是一样的,刚才仿真了,波形和rtl图都一样,但是我的那个写法不建议写, ...

1、写代码要从仿真的角度看。  
   count  <= count + 1 ;
   if(count == 5000)  count <=  0;
两条语句顺序执行。 同时准备count的值(并行)。  第一条语句加一后,count的值到了5000.。。。
第二条语句准备的值是4999.   所有不能使得count复位。从寄存器的角度来看,这也是正确的,也就是更新值要在一个时钟之后。
2、楼主的第二种写法,语法不能算错。 编译有错是因为要求: 条件语句要受到敏感信号的控制,也就是要受到rst信号的控制。

一周热门 更多>