作者Baneling (爆炸一哥)
看板Electronics
标题Re: [问题] Verilog 用 data edge 作为讯号输入
时间Mon Jan 4 02:02:15 2016
※ 引述《FTICR (FT-ICR)》之铭言:
: 标题: [问题] Verilog 用 data edge 作为讯号输入
: 时间: Sun Jan 3 00:25:26 2016
:
: 各位板友好
:
: 想问一个基本的问题
:
: 一般verilog 常见的写法可能是这样
:
: //sequentail part
: always@(posedge clock) begin
: if (rst) begin //synchronous reset
: state <= state_1;
: ...
: end
: else begin
: state <= next_state;
: ...
: end
: end
:
: //combinational part
: always@(*) begin
: case(state)
: state_1: begin
: if (a==1) begin
: next_state = state_2;
: end
: end
: …
: endcase
: end
:
:
: 但如果如果想用一个讯号的 edge 来进到下个 state (asynchronous) 不知道怎麽作比较好
:
:
: 以下写法我知道不太合理
:
: //sequentail part
: always@(posedge clock) begin
: if (rst) begin
: state <= state_1;
: ...
: end
: else begin
: state <= next_state;
: ...
: end
: end
:
:
: //combinational part
: always@(*) begin
: case(state)
: state_1: begin
: if (posedge a) begin
: next_state = state_2;
: end
: end
: …
: endcase
: end
:
:
:
: 请问各位前辈,正确的可以实现上面这个功能写法应该怎麽作?
:
:
: 谢谢!
看你的想法我大概会有几个疑问吧
1.你这样写或者要实现这样的function想要得到什麽样的好处?
一般来说如果真的要对clock动手脚一定会有甚麽原因
不外乎操作速度要更快或者面积要更小, 或者是逼不得已的情况(介面处理)
2.clk与a这两个讯号的关系?
如果a是源自於clk的讯号,简单来说就是同步的东西
那就在状态转换的时候写一个条件去判断就好了
如果是不同步的两个讯号, 那状态机为何要用两个不同的clock去驱动?
而且处理不同步的讯号也不是用这种方式去处理的~
如果你真的想要把这种做法实现,我大概会用这种方式去写
always@(posedge clk_a or negedge rst) begin
if(!rst) state<=state_1;
else begin
case(state)
state_1: begin
state<=state_2;
end
state_2: begin
..
..
endcase
end
end
assign clk_a=(state==state_1) ? a : clk;
只是你在synthesis以及APR的时候对clock下的constraint
还是要去思考我上面问的那些问题
(考虑clk_a, clk, a等讯号之间的关联性)
:
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.77.56
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1451751928.A.BE0.html
: 推 kyo547896321: 照你这写法,还是得等clk才能换state吧? 01/03 01:51
: 这个写法连 ncVerilog 都不过 (更不用说合成了)
: → kyo547896321: 如果是要和这block本身的clk不同步的话,那把你的a 01/03 01:53
: → kyo547896321: 当作另一个DFF的clk来写,a的edge一来就能换state 01/03 01:54
: 确实觉得可能需要灌进去 clock,但 Verilog 有办法合成出这样的电路吗?
: → kyo547896321: 不知道有没有误会你想问的问题就是了 01/03 01:54
: 推 kyo547896321: 毕竟你的code和你描述的作法不是同一件事情 01/03 02:02
: → kyo547896321: 1.用posedge a改next_state 2.用posedge a改state 01/03 02:07
: → kyo547896321: 你的code是1但你的描述看起来像2 01/03 02:09
: 1的功能应该是 synchronous (在state_1时,如果a==1,posedge clock时会到state_2)
: → kyo547896321: 要不要先说一下你的"进到下一个state" 01/03 03:56
: → kyo547896321: 是改变state还是next_state 01/03 03:57
: → kyo547896321: 如果是改state,那将a当作另一个DFF的clk是可行的 01/03 04:02
: → kyo547896321: 毕竟不同block本来就可能用到不同的clk 01/03 04:03
: → kyo547896321: 只是你得考虑multiple clk domain面临的麻烦就是 01/03 04:04
: 当然是改变 state,只是先在 conbinational part 输出到DFF的D,在sequentail part
: posedge clock 时存进去(D → Q)
: → Baneling: 建议你先有能力把基本能合成的code直接变成电路的能力 01/03 14:30
: → Baneling: 再来想这些... 不过通常你弄懂电路的概念之後, 大概就知 01/03 14:31
: → Baneling: 到你现在乱写code的"点"在哪了 01/03 14:31
真心建议你,先把"可合成"的verilog语法弄熟,其实当初教我做数位IC的人讲过一句话
你写的verilog大多是把你想像中的硬体写出来,硬体我们能用的不外乎就是flip flop
latch跟logic gate,因此procedural block中的sensitivity list会写成这样
简单来说就是模拟器执行这些可合成语法的方式会类似真实电路的动作
因此这些语法就会被归类为"可合成"
是因为合成软体看到这类型的code会找出相对应的硬体。
如果短时间之内没办法做到这种程度就先了解到
"testbench想怎麽写没关系,但设计一定要用可合成的语法"
: 我想把 Verilog code 画成电路这我作的到
其实你想像中的情况跟我想表达的情况应该有一段差距 :s
:
: 想了一段时间,不知道 sequentail part 这样写是不是一个方法?
: //sequentail part
: always@(posedge clock or posedge a) begin
: if (rst) begin //synchronous reset
: state <= state_1;
: ...
: end
: else if (a && state==state_1) begin
: state <= state_2;
: end
: else begin
: state <= next_state;
: ...
: end
: end
可能我用的standard cell比较单纯,我几乎没写过这种可以被两个clock trigger
的procedural block,一般来说没有DFF可以同时被两种clock触发,所以这种写法
就算能用,在coding style上来说也是很不好
要也是像我上面那样写,先把clock处理过後再送到DFF。
(当然constraint要怎麽下又是另外一回事了)
另外建议你,写FSM就把comb跟sequ写在一起了,因为大部分写法都把控制讯号
跟FSM的state写在一起,当你状态很多的时候描写state的procedural block会拖很长
你每个控制讯号独立写成单一procedural block,debug的时候你看自己的code
会上上下下拉到很想死。
: ※ 编辑: FTICR (219.70.169.149), 01/03/2016 16:07:20
: 推 ptta: 就是把一个 之 comb signal当成 clock,可以合成,十年前就看 01/03 17:11
: → ptta: 过了 01/03 17:11
其实有经验,code写出来有相对应的synthesis以及APR(CTS)的constraint
要怎麽做大概都可以,问题就在於很多人在下constraint的时候其实都没有弄得很清楚
EDA tool解读这些constraint的方式还有处理电路的手法,如果是这种情况
我觉得就先别去把设计搞这麽复杂了,single clock domain的设计先弄清楚吧~
原po写code的方式感觉就是刚出新手村,就不太建议自己去找麻烦 XD
: 推 Leadgen: Comb signal当clock,不怕有glitch吗? 01/04 00:04
嗯呀,真的要对clock动特别的手脚(除频以外的功能),也是使用DFF的输出居多。
不过CTS也要另外处理,通常是吃力不讨好
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 182.234.146.229
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1451844137.A.365.html
1F:推 obov: 把verilog/HDL当C(or其他)写的人 尤其是以前资工转硬体的 01/04 02:41
2F:→ obov: 最常见的观念错误就是 不懂甚麽叫做DFF 01/04 02:42
3F:→ obov: DFF最重要的一个特性 就是setup/hold time 01/04 02:42
4F:→ obov: 这是当代绝大多数数位电路设计的核心 01/04 02:43
5F:→ Baneling: 他们会觉得那是一种变数~ 01/04 03:04
6F:推 xanter: 原PO写的CODE真的像新手村出来的 01/04 10:16
7F:→ tonybin: 竟然需要教主出来教电子学 囧 01/04 18:08
8F:推 cebelas: 教主安安 01/04 18:35
9F:推 ptta: 教主安安 有些设计不得不这样做(以 comb 当 clock) 01/04 20:00
10F:→ Baneling: 其实clock gating就是一个例子了,用comb当做clock,要 01/04 21:40
11F:→ Baneling: sequ cell来同步变化过後的clock(CG是用latch),不然有 01/04 21:41
12F:→ Baneling: glitch,这chip就算挂了... 01/04 21:42
13F:→ obov: 一般来讲现有的digital design flow重视的是clock domain 01/06 01:35
14F:→ obov: 跟clock没有直接关系的sig就不能拿去当dff的clk 01/06 01:37
15F:→ obov: 当然没有人规定一定要遵循这个flow就是惹 01/06 01:38
16F:→ Baneling: ob"_"ov 01/06 18:54
17F:推 obov: 古时候曾经一度有点秋的topic叫做asynchronous design 01/07 00:32
18F:→ obov: 这idea最大的笑话就是 功耗很低 01/07 00:33
19F:→ obov: 可是研发时间长到哭爸 bug也多到哭爸 等你能卖的时候 01/07 00:34
20F:→ obov: 对手光制成就推进两三代惹 结果功耗还比你低 01/07 00:34
21F:→ Baneling: asynchronous design现在成熟很多了 只是它并非完全asyn 01/07 13:05
22F:→ Baneling: 做SoC还是会把clock domain切成好几块处理 单一clock是 01/07 13:06
23F:→ Baneling: syn,不同clock做成asyn 01/07 13:07
24F:推 obov: 古时候的async好像有一堆handshaking 01/07 15:43
25F:→ obov: soc不同clk domain有些是会放fifo 01/07 15:43
26F:→ obov: 这两个概念不一样 我说的那个古时候的async是在炒clockless 01/07 15:44
27F:→ obov: 其实也没很古 十几年前而已 01/07 15:44
28F:→ Baneling: 对呀 你说的那种其实有点类似用circuit的概念来做数位电 01/07 17:14
29F:→ Baneling: 路, 在设计上不太可能快的了的 XDD 01/07 17:14