微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 各位大侠来讨论一个verilog的问题

各位大侠来讨论一个verilog的问题

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

不同的always里给同一个值赋值,一般是不可综合的,鄙人现在出现了一个这样的问题,,一个always里面的逻辑比较复杂,主要是状态机,当输入是一种很特别的情况时,在同一时刻对某一个变量赋不同值(0和1)了。仿真出来,这个变量总是选择了0.综合后的后仿结果和前仿一致,modelsim和DC都没有报错。
请问:
1、这种同一时刻赋不同值的情况出现的可能性特别特别小,就一个时钟周期的范围,而一个时钟周期相对于本设计的应用是很小很小的,可以忽略,但不知道由此综合出来的电路会不会有很大的潜在问题。或者没有什么大问题,可以跳过它。
2、此逻辑包含状态机a和状态机b,状态机a中给一变量f赋值了,f的值影响状态机b的状态,而b的状态是独立于a的,b中也对f进行赋值了。这种设计问题还是比较大的吧?
文字描述不太清楚,看例子。
例子如下:
  always @(posedge clk or negedge rstn)
   begin
    if(~rstn)
     ........
    else
       begin
          case(state)
              IDLE:
                          state<=s1;
                          .........
             s1  :
                          state<=s2;
                          .......   
             s2  :  
                          state<=s3;
                          f<=1;
                          ..........
             s3  :
                          ......
                          state<=s2;
       endcase
   
      case(second_state)
                       ss0:     begin
                                     if(f==1'b1)
                                          second_state<=ss1;
                                    else
                                          second_state<=ss0;
                                  end
                      ss1:     begin
                                    .............
                                    second_state<=ss0;
                                    f<=1'b0;
                                 end
      endcase
      
  就是在一种特殊情况下,s2向s3跳转,ss1向ss0跳转,这种情况下,f的值就不确定了。这个情况在现实中发生的可能性很小.   
希望各位大侠广开言路,只要与本帖子相关,欢迎讨论,谢谢各位了!



    是同一个always里面赋值的,同一个always里面有两个状态机,逻辑比较复杂,会出现同一时刻x被赋同一值。
注:是同一个always里面!

这个是语法解释的问题,最终综合出来的电路一个状态下只会给信号一个赋值,就看这个值是不是你想要的了。
只是这样debug起来很困难。
always@(posedge clk or negedge xreset)
if (~xreset)
  a <= 1'b0;
else begin
  a <= 1'b0;      //这种并行的写法类似你说的,在一个always的两个状态机内对同一个信号赋值
  if(b==0)begin //一般会编译成 b!=0时a=0,else,b==0时a=1,而不会有冲突。
    a<= 1'b1;
  end
end
--------------------------------------------
但是会有与设计思想不符的风险。



    额,,就你举的这个例子来说。你说可能和设计思想不符。如果编译的结果和我的设计思想是一致的话,,就不会有什么危险了?

“状态机a中给一变量x赋值了,x的值影响状态机b的状态,而b的状态是独立于a的,b中也对x进行赋值了。”
从上面的句子看出,a和b是有关系的,你虽然这么写了,但是未必会a和b两个状态会同时出现吗?如果会,那还要取决于你采用什么赋值方式,如果是阻塞的,则最后一个有效,如果是非阻塞的,好像也是最后一个有效。确实是有风险,不太好分析。



    你所说的最后一个是指什么呢?



    可以使用。
只要你脑袋里有这个意识,并确认了ok,当然可以使用。

首先,不要以为写在同一个always块里就是一个电路。否则大可以把所有的同时钟电路放到一个always块里了。
一般来说,要求一个always块只完成一个功能。你这2个状态机完全不相关,因此按照coding style是要放在2个always块里,然后编译的时候会告诉你不建议在不同的always块里对同一个变量赋值,这样是有隐患的。除非你能保证这种情况下没有冲突,或者冲突不会导致你系统错误。



    恩,,冲突就是同时给它赋零和1,冲突发生时赋零和赋1对我功能没多大影响。这种情况下如何考量这种设计

a影响X, X影响b,所以a与b相关。
你说的a与b独立有问题。
还有推荐一个always只对一个信号控制和赋值。

首先考虑是不是设计思路有问题或者架构问题。
如果不能在这个层次上避免的话,就修改代码。
第一个状态机产生f1,第二个产生f0,然后在新的always块中根据条件输出f。这时候就需要考虑0状态重要还是1状态重要,用if语句产生优先级判断。

这就看你2个赋值同时发生时是否有其他的判断来选择取值,如果没有的话,感觉是否在逻辑上存在问题



    若不可避免的会出现这种请况,你的意思是说可以用if语句选择到底赋哪个值?具体如何实现?

if语句有优先级,判断if成功后就不会判断else

小编对数字设计理解还是不够
目前这种状况在规范设计中就是不该存在的问题
你应该想的是怎么避免出现这种描述,而不是这样描述以后影响大不大
思路要清晰 不要舍本逐末



    en ..这位大侠说的有道理。

这种有风险,可能会出现你不想要的结果。用if else来做可能会避免,因为有优先级。

小编你可以把对f变量的赋值来到外面来。然后判断啥时候set为1,啥时间被clear,这样不是很清楚的结构吗,干嘛搞的这样混乱,你这样写的style 根本不符合verilog的标准,还是那就话,电路的设计不是靠verilog的,
设计是靠人脑的,verilog只是把你脑中设计好的电路描述出来,一定要弄清楚verilog是硬件描述语言,不是设计语言。你这个不是在两个always快中DC可能不会报,但是你用style check的工具(spyglass)check一下你的代码应该能报出问题来。

好好研究一下

这样做,好危险啊!

既然状态a、b是独立的
就应该独立出来写
通过中间信号来控制状态b的跳转

建議將這兩段code拆成兩個always
同一個always盡可能不要放一些較不相似的code進去較好
一方面可以減少硬體面積
一方面也可避免功能出錯
例外就是建議樓主可以將這幾行CODE加上 #1 delay上去看看
確定再有延遲的狀況下也能正常動作

写在同一个always块里未必是一个电路

yes, although u can get desired output waveform, gate simulation (synthesis) will be not correct, ha, keep it up...

进来看看。

s说的好

电路《---》Verilog, 这不是一个先有鸡还是先有蛋的问题,而是,你一定要有电路,才能写Verilog。如果你不搞清楚要设计模块的功能/时序/接口/状态。试问如何写Verilog。好大的胆子还能写出Verilog,这样的Verilog做出来的芯片失败的概率有多大?
沉下心来,慢慢分析,想清楚了之后下笔就简单多咯,验证也就简单多咯。小编这样可能会导致Synthesis和Simulation不匹配的代码还是三思为妙,三思三思。切勿急功近利。

学习学习

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

网站地图

Top