微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求教,verilog里面能在if语句中使用assign吗

求教,verilog里面能在if语句中使用assign吗

时间:10-02 整理:3721RD 点击:
一段逻辑这样写编译不过:
if(xxx)
assign aa = bb;
else
assign aa = cc
如果写成
assign aa = (xxx) ? bb : cc
就能编译过。

assign 用于连续赋值语句,if-else用于RTL级描述中,被赋值的变量都是reg类型。
reg类型赋值分blocked和nonblocked,即=和<=,不需要再使用assign



    谢谢,不过我程序里的aa是wire型的,需要用assign来赋值,就像这样的逻辑只能用()?xx:yy这种形式吗,如果逻辑复杂这种形式的代码可读性很差,还是if else代码比较清晰。

if... else...不能用在程序块外八,要用在initial 或者always里面



    那么实现我的程序只能有(xx) ? bb : cc 吗?

这。always里面定义成reg型,assign定义wire型。

verilog 中可综合的只有always 和 assign两种语句,if。else只能用在always语句块里面,

要想用if-else,得这样:
reg aa;
always @(*)
  if(xxx)
    aa = bb;
  else
    aa = cc;
综合的电路都一样。

试过,不行,建议小编自己也试一试

谢谢大家了

要在always块里面

没这样用过。

reg aa;
always @(aa or bb or cc)
if(xxx)
aa = bb;
else
aa = cc;
等价于
wire aa;
assign aa = (xxx) ? bb : cc;

reg aa;
always @(aa or bb or cc)
if(xxx)
aa = bb;
else
aa = cc;
等价于
wire aa;
assign aa = (xxx) ? bb : cc;

不行,这样综合过不了的

同意8楼~虽然定义的是reg型~但综合出来还是组合逻辑

肯定是不行的啊
Verilog里面几个进程是并发执行,不能是包含关系
initial
always
assign
task
这三个必须得单独做为一个进程

reg aa;
always @(*)   //// 要写成*   否则易错
if(xxx)
aa = bb;
else
aa = cc;
等价于
wire aa;
assign aa = (xxx) ? bb : cc;

都是组合电路     不会产生寄存器
第一个写法之所以写成 reg  aa 是因为语法要求always里面被赋值的必须是reg,综合出来是wire

呃。建议小编先看看Verilog的书

好!

看书先吧

这个是连续性赋值语句啊

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

网站地图

Top