打印
[verilog]

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

[复制链接]
1407|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  reg [31:0]Count;
  //写法1:正确
  always@(posedge sys_clk50,negedge rst_n) begin
    if(!rst_n) begin
      Count <=32'd0;
    end
    else begin
      Count <=Count+1;
      if(Count >= 5000) begin //写法正确
        Count <=0;
      end
    end
  end
  
  //写法2:编译报错
  always@(posedge sys_clk50,negedge rst_n) begin
    if(!rst_n) begin
      Count <=32'd0;
    end
    else begin
      Count <=Count+1;
    end
    //-------------------------编译报错
    if(Count >= 5000) begin
      Count <=0;
    end
  end


verilog刚学,,不太明白,报错的提示也不理解,谢谢先

使用特权

评论回复

相关帖子

沙发
rongzhai| | 2019-9-10 18:15 | 只看该作者
本帖最后由 rongzhai 于 2019-9-10 18:17 编辑

第二种写法,复位操作中的else和 if(Count >= 5000)是并行执行,逻辑操作上相当于同一时刻对同一个对象进行操作。

使用特权

评论回复
板凳
(⊙o⊙)你|  楼主 | 2019-9-11 08:56 | 只看该作者
rongzhai 发表于 2019-9-10 18:15
第二种写法,复位操作中的else和 if(Count >= 5000)是并行执行,逻辑操作上相当于同一时刻对同一个对象进行 ...

always中的语句不都是顺序执行的吗?

使用特权

评论回复
地板
GavinZ| | 2019-9-14 10:10 | 只看该作者
两种都不对。应该这样写:
  always@(posedge sys_clk50,negedge rst_n) begin
    if(!rst_n) begin
      Count <=32'd0;
    end
    else begin
          if(Count >= 5000) begin
               Count <=0;
          end
          else begin
             Count <=Count+1;
         end
    end
  end

使用特权

评论回复
5
zhangmangui| | 2019-9-14 14:28 | 只看该作者
GavinZ 发表于 2019-9-14 10:10
两种都不对。应该这样写:
  always@(posedge sys_clk50,negedge rst_n) begin
    if(!rst_n) begin

常见的写法都是这样的

使用特权

评论回复
6
xiaochunyuan| | 2019-9-17 16:08 | 只看该作者
GavinZ 发表于 2019-9-14 10:10
两种都不对。应该这样写:
  always@(posedge sys_clk50,negedge rst_n) begin
    if(!rst_n) begin

他说的第一种是对,我觉得,你这样会多一个clk,比如到了5000不会执行清0,而要到5000的下一个clk时才会清0,但第一种就是到了5000然后就顺序执行了清0语句。

使用特权

评论回复
7
xiaochunyuan| | 2019-9-17 16:09 | 只看该作者
GavinZ 发表于 2019-9-14 10:10
两种都不对。应该这样写:
  always@(posedge sys_clk50,negedge rst_n) begin
    if(!rst_n) begin

他说的第一种是对的,我觉得,你这样会多一个clk,比如到了5000不会执行清0,而要到5000的下一个clk时才会清0,但]第一种就是到了5000然后就顺序执行了清0语句。

使用特权

评论回复
8
xiaochunyuan| | 2019-9-17 16:12 | 只看该作者
xiaochunyuan 发表于 2019-9-17 16:09
他说的第一种是对的,我觉得,你这样会多一个clk,比如到了5000不会执行清0,而要到5000的下一个clk时才 ...

不对,应该是你的和他的第一种是一样的,都对,只是表达方式不同

使用特权

评论回复
9
(⊙o⊙)你|  楼主 | 2019-9-18 14:02 | 只看该作者
xiaochunyuan 发表于 2019-9-17 16:12
不对,应该是你的和他的第一种是一样的,都对,只是表达方式不同

嗯,我的第一种和他的写法的效果是一样的,刚才仿真了,波形和rtl图都一样,但是我的那个写法不建议写,不好理解,,,,

为啥我的第一种写法中:
1、第一句话执行后已经满足第二句话了,为啥当时第二句话没有执行,要等到下一个clk后才执行呢?
2、下面2句话是顺序执行的还是并行执行的呢?

      Count <=Count+1;
      if(Count >= 5000)  Count <=0;

使用特权

评论回复
10
(⊙o⊙)你|  楼主 | 2019-9-18 14:03 | 只看该作者
zhangmangui 发表于 2019-9-14 14:28
常见的写法都是这样的

谢谢,能帮我回答下9楼的问题吗

使用特权

评论回复
11
(⊙o⊙)你|  楼主 | 2019-9-18 14:03 | 只看该作者
GavinZ 发表于 2019-9-14 10:10
两种都不对。应该这样写:
  always@(posedge sys_clk50,negedge rst_n) begin
    if(!rst_n) begin

谢谢,能帮我回答下9楼的问题吗

使用特权

评论回复
12
(⊙o⊙)你|  楼主 | 2019-9-19 16:23 | 只看该作者
本帖最后由 (⊙o⊙)你 于 2019-9-19 16:24 编辑
(⊙o⊙)你 发表于 2019-9-18 14:02
嗯,我的第一种和他的写法的效果是一样的,刚才仿真了,波形和rtl图都一样,但是我的那个写法不建议写, ...

想明白了,,直接看RTL图就全部明白了
1、第一次时不满足条件条件,所以没有清0,第二次满足了条件,故清了
2、并行执行

详情见下图


使用特权

评论回复
13
zhangmangui| | 2019-9-19 22:09 | 只看该作者
(⊙o⊙)你 发表于 2019-9-19 16:23
想明白了,,直接看RTL图就全部明白了
1、第一次时不满足条件条件,所以没有清0,第二次满足了条件,故清 ...

身边多年的逻辑工程师   关键时候都去看逻辑原理图

使用特权

评论回复
14
GavinZ| | 2019-10-1 22:51 | 只看该作者
xiaochunyuan 发表于 2019-9-17 16:08
他说的第一种是对,我觉得,你这样会多一个clk,比如到了5000不会执行清0,而要到5000的下一个clk时才会 ...

别分析楼主的错误写法了,没意义。你说的问题是不存在的问题。想到5000复位,把触发阈值改成4999就行了。哪会有你说的问题呢,对吧。

使用特权

评论回复
15
GavinZ| | 2019-10-1 22:53 | 只看该作者
本帖最后由 GavinZ 于 2019-12-3 09:03 编辑
xiaochunyuan 发表于 2019-9-17 16:12
不对,应该是你的和他的第一种是一样的,都对,只是表达方式不同

别用那种方式了。那是不对的。编译器再聪明,你还得理解语言造成的行为后再写出明确无歧义的编码才行。

使用特权

评论回复
16
GavinZ| | 2019-10-1 22:59 | 只看该作者
(⊙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 呢?
明显存在歧义,如果不是综合工具够聪明,你这就是自造麻烦。你应该先弄清楚语言的含义,就不会写出不合实际的代码了。

使用特权

评论回复
17
ycwjh2002| | 2019-12-2 16:31 | 只看该作者
GavinZ 发表于 2019-10-1 22:59
你怎么老提顺序执行,这不是基于MCU的C语言。
fpga就是一堆寄存器加组合逻辑,是基于当前执行下一个clock ...

没有深刻理解非阻塞赋值。 这样写虽然不推荐,实际上逻辑上是正确的。

使用特权

评论回复
18
ycwjh2002| | 2019-12-2 16:52 | 只看该作者
(⊙o⊙)你 发表于 2019-9-18 14:02
嗯,我的第一种和他的写法的效果是一样的,刚才仿真了,波形和rtl图都一样,但是我的那个写法不建议写, ...

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

使用特权

评论回复
19
(⊙o⊙)你|  楼主 | 2021-5-10 15:20 | 只看该作者
好久没来了,,,,,今天来看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

58

帖子

1

粉丝