albert_w 发表于 2012-1-18 00:46:26

新手提问,关于综合的Verilog语法问题

网上几乎都流传着,要在always的敏感量写该always包含的全所有有值,否则,你会发现综合器会帮你写.
那么,假如我要在clk边沿对多个输入采样,那岂不是搞成异步的咯? 那要实现我原本的逻辑该怎么搞呢?
目前只放了clk进去
        always @ (negedge rst_n or posedge clk) begin
....blabla....

                else begin
                        sig <= ~sig;
                        cnt <= cnt + 9'd1;
                        if (puls_p) begin
                                if (!last_p) begin
                                        num_puls = num_puls + 8'sd1;
                                        shift_out = shift_out + 16'sd1;
                                end
                        end
...

仿真(门级)显示仅仅当clk的时候才进入该always, 和理论吻合,但和网上流传的经验不吻合. 实际和门级仿真吻合.
使用always* 后仿真显示快速反复进入always,而不像传说的自动添加敏感量.
======看起来Quartus并没有偷偷为我添加敏感量.========


流传还说,== != 不可以综合, 那么要做一个计数器分频该怎么搞呢?
可是我使用了==比如 计数器溢出到0的时候: if (xxx == x'd0) blablabla
看起来也工作得很好呢?!


到底哪些不可以综合?
我知道多过程对同一个变量赋值不可以, 对敏感量做非边沿的(比如敏感量上升沿,但在内部判断下降沿会出错) 判断不可以
分支对非敏感量做if的时候,如果让该if为true的敏感量有多个(走到if分支前没有限定死),似乎就会出错。 感觉综合器实现了一个触发器,如果该锁存器需要不止一个个时钟,就会报错。


等高手解答, 感觉Verilog语法不难,综合不简单啊。

albert_w 发表于 2012-1-18 01:12:53

最想要的是进入always以后,如何知道是哪个敏感量干的? 里面的if只能判断点评,不太够用。
假设我同时两个异步触发,A做加法计数,B做减法计数。
通过always @ (posedge A or posedge B) begin
进来以后不知道该怎么办了...

y595906642 发表于 2012-1-18 09:12:51

不懂Verilog
以下是借用ISE里的范例


--同步复位
   reg [<upper>:0] <reg_name>;
   
   always @(posedge <clock>)
      if (!<reset>)
         <reg_name> <= 0;
      else if (<clock_enable>)
         if (<load_enable>)
            <reg_name> <= <load_signal_or_value>;
         else if (<up_down>)
            <reg_name> <= <reg_name> + 1;
         else
            <reg_name> <= <reg_name> - 1;
                                       
--异步复位
   reg [<upper>:0] <reg_name>;
   
   always @(posedge <clock> or negedge <reset>)
      if (!<reset>)
         <reg_name> <= 0;
      else if (<clock_enable>)
         if (<load_enable>)
            <reg_name> <= <load_signal_or_value>;
         else if (<up_down>)
            <reg_name> <= <reg_name> + 1;
         else
            <reg_name> <= <reg_name> - 1;

usingavr 发表于 2012-1-18 09:19:02

LZ听到的“流传”还真是多,还真是离谱.
首先,写硬件代码的要清楚写的代码到底会生成怎么样的逻辑电路。
根本上来说,如果写的代码不能生成逻辑电路,那么就不可综合。
比如 a <= #10 b; 延时就是不可综合的,只是方便仿真用的。
再比如 initial 用来初始化,但实际电路的寄存器初始值往往是无法确定的,只能用复位(预置位)的方式保证初始值。

什么信号要写入always敏感信号列表里,首先要弄清楚什么是敏感信号。
一般来说,时序的敏感信号是时钟和复位;组合逻辑的敏感信号是所有输入信号。

ahuang227 发表于 2012-1-18 10:17:10

不懂,一直是VHDL的。

albert_w 发表于 2012-1-18 13:32:14

回复【3楼】usingavr
lz听到的“流传”还真是多,还真是离谱.
首先,写硬件代码的要清楚写的代码到底会生成怎么样的逻辑电路。
根本上来说,如果写的代码不能生成逻辑电路,那么就不可综合。
比如 a &lt;= #10 b; 延时就是不可综合的,只是方便仿真用的。
再比如 initial 用来初始化,但实际电路的寄存器初始值往往是无法确定的,只能用复位(预置位)的方式保证初始值。
什么信号要写入always敏感信号列表里,首先要弄清楚什么是敏感信号。
一般来说,时序的敏感信号是时钟和复位;组合逻辑的敏感信号是所有输入信号。
-----------------------------------------------------------------------
网上有一篇所谓的能综合的RTL子集... 看完渗得慌.

一般来说,时序的敏感信号是时钟和复位;
这句话让我放心不少.

不过话说处理多个异步信号是不是本身就比较棘手? 他们控制的reg又相互牵扯,不能做到两个always里面. 昨晚试了试,还是没法判断出谁的边沿到了,而且always反复触发了.

新手,一小段代码就花掉100个LE,感觉一片240也不经用呢...

h2feo4 发表于 2012-1-18 13:45:38

回复【楼主位】albert_w
-----------------------------------------------------------------------

LZ在一个always块里混用阻塞和非阻塞赋值,看不懂想干啥
先描述下你想实现个什么样的功能吧

Nuker 发表于 2012-1-18 16:15:22

LZ还是先看看官方的Coding指南吧,虽然花时间,但是还是值得的。

点击此处下载 ourdev_713734LBNHZW.pdf(文件大小:2.04M) (原文件名:Altera的代码规范Verilog Coding Style Proposal.pdf)

点击此处下载 ourdev_713736RTNSZB.pdf(文件大小:536K) (原文件名:Qts_QII51007.pdf)

albert_w 发表于 2012-1-18 17:22:51

非常感谢楼上各位的帮助!

回无机酸
这是我写的第三个模块,大学写了一个,再写了个hello quartus.
这个模块想用来计数. 两个脉冲输入,p脉冲计数器+1, n脉冲-1, 同时计算出最后一个脉冲的频率(不好搞,弄成100个clk内计算脉冲的代数和了),以及最后的脉冲总数代数和. 其实就是计算速度和位移的.
本来都想非阻塞的,但部分代码之间有先后关系(比如+1,然后送到端口),无奈只得把这部分改成阻塞,于是弄出楼顶的四不像了.!

谢谢Nuker下载来,找时间学习学习.

h2feo4 发表于 2012-1-18 22:42:18

回复【8楼】albert_w
-----------------------------------------------------------------------

东西不多却涉及三个时钟域,有点小麻烦
比较严谨的方法是,写三个always块,分别对p、n和clk敏感
在p和n的块里各自进行格雷码计数
在clk的块里对p和n的计数值同步后解码求差
另外要注意溢出和亚稳态等细节问题

如果clk频率比p和n高四倍以上,可以用clk对p和n采样后同步计数,结构会简单一些。

albert_w 发表于 2012-1-18 23:41:41

回复【9楼】h2feo4无机酸
回复【8楼】albert_w
-----------------------------------------------------------------------
东西不多却涉及三个时钟域,有点小麻烦
比较严谨的方法是,写三个always块,分别对p、n和clk敏感
在p和n的块里各自进行格雷码计数
在clk的块里对p和n的计数值同步后解码求差
另外要注意溢出和亚稳态等细节问题
如果clk频率比p和n高四倍以上,可以用clk对p和n采样后同步计数,结构会简单一些。
-----------------------------------------------------------------------
现在就是提高clk快速采样来实现的,总感觉有点别扭哈哈. 本意是想分开来做成异步的,clk只拿来提供一个计时基准,做起来不太容易. 回头用你说的方法写写看.

pangfen 发表于 2012-1-18 23:56:39

记号

Nuker 发表于 2012-1-19 01:25:24

回复【1楼】albert_w
最想要的是进入always以后,如何知道是哪个敏感量干的? 里面的if只能判断点评,不太够用。
假设我同时两个异步触发,a做加法计数,b做减法计数。
通过always @ (posedge a or posedge b) begin
进来以后不知道该怎么办了...
-----------------------------------------------------------------------

假如A和B的升沿以及clk的升沿同时来到,是否违反时序要求?实际应用中这种情况是否会发生?

albert_w 发表于 2012-1-19 02:10:18

回复【12楼】Nuker
回复【1楼】albert_w
最想要的是进入always以后,如何知道是哪个敏感量干的? 里面的if只能判断点评,不太够用。
假设我同时两个异步触发,a做加法计数,b做减法计数。
通过always @ (posedge a or posedge b) begin
进来以后不知道该怎么办了...
-----------------------------------------------------------------------
假如a和b的升沿以及clk的升沿同时来到,是否违反时序要求?实际应用中这种情况是否会发生?

-----------------------------------------------------------------------
a或b和时钟很有可能同时,ab一般不会同时出现。这个双时钟域异步还没想好怎么做

h2feo4 发表于 2012-1-19 14:19:40

先想好你的功能用什么样的电路能实现,再考虑怎么用代码描述你的电路。
对两个时钟敏感的always块在绝大部分情况下都是非法的,如果不是时钟而是异步set、reset或load倒是可以

wangzhenhui 发表于 2014-5-4 21:24:41

你好,你给我留言了,可是我没有权限回复你,只能在这里给你留言,我的qq 41747523
页: [1]
查看完整版本: 新手提问,关于综合的Verilog语法问题