微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 问个verilog语法问题

问个verilog语法问题

时间:12-12 整理:3721RD 点击:
☆─────────────────────────────────────☆
   fastwind1985 (快风) 于  (Thu Jun  4 16:21:29 2009)  提到:
可否用一个变量来选另一个变量的某几位?
比如:
reg [3:0]a;
reg [31:0]b;
…………
t1时刻, a <= 4'b1110;
t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
求教。bow~
☆─────────────────────────────────────☆
   RedLaser (范哥儿~) 于  (Thu Jun  4 16:38:28 2009)  提到:
这只是看起来简单了一点
就算是综合成功,实际上也还是把2'b10赋给b[31:30]到b[1:0]都做好放那了,然后做了个选通
面积一点不省
另外,好像a要定义成integer
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 可否用一个变量来选另一个变量的某几位?
:
: 比如:
: reg [3:0]a;
: reg [31:0]b;
:
: …………
:
: t1时刻, a <= 4'b1110;
: t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
:
: 求教。bow~
:
: --
:
: ※ FROM: 122.234.54]
: ※ 来源:·水木社区 newsmth.net·[FROM: 122.234.54]
☆─────────────────────────────────────☆
   reverie (hello world) 于  (Thu Jun  4 18:12:56 2009)  提到:
好像不行吧
除非a是参数之类的确定值吧
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 可否用一个变量来选另一个变量的某几位?
:
: 比如:
: reg [3:0]a;
: reg [31:0]b;
:
: …………
:
: t1时刻, a <= 4'b1110;
: t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
:
: 求教。bow~
:
: --
:
: ※ FROM: 122.234.54]
: ※ 来源:·水木社区 newsmth.net·[FROM: 122.234.54]
☆─────────────────────────────────────☆
   landice (Eternal Blue) 于  (Thu Jun  4 18:40:08 2009)  提到:
verilog 2001的语法:b[a -: 1]
这个至少在FPGA里面是能综合的,综合结果是桶型移位
【 在 reverie (hello world) 的大作中提到: 】
: 好像不行吧
: 除非a是参数之类的确定值吧
☆─────────────────────────────────────☆
   fastwind1985 (快风) 于  (Thu Jun  4 18:53:07 2009)  提到:
其实我的目的是,一个32bit的寄存器中,当前在第a位(每个时钟都可能变化),要找出
第a位后面第一个非零值是在哪一位。
本来想通过每次观察b[a],b[a-1],……再根据这些值中第一个非零值选通一下。但不能
b[a]这样用就有点麻烦了
【 在 RedLaser (范哥儿~) 的大作中提到: 】
这只是看起来简单了一点
就算是综合成功,实际上也还是把2'b10赋给b[31:30]到b[1:0]都做好放那了,然后做了个选通
面积一点不省
另外,好像a要定义成integer
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 可否用一个变量来选另一个变量的某几位?
:
: 比如:
: reg [3:0]a;
: reg [31:0]b;
:
: …………
:
: t1时刻, a <= 4'b1110;
: t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
:
: 求教。bow~
:
: --
:
: ※ FROM: 122.234.54]
☆─────────────────────────────────────☆
   fastwind1985 (快风) 于  (Thu Jun  4 18:53:59 2009)  提到:
桶形移位……或许直接用这个可以试试
【 在 landice (Eternal Blue) 的大作中提到: 】
verilog 2001的语法:b[a -: 1]
这个至少在FPGA里面是能综合的,综合结果是桶型移位
【 在 reverie (hello world) 的大作中提到: 】
: 好像不行吧
: 除非a是参数之类的确定值吧
☆─────────────────────────────────────☆
   siaga (aaaa) 于  (Thu Jun  4 19:39:00 2009)  提到:
不能
【 在 fastwind1985 (快风) 的大作中提到: 】
: 可否用一个变量来选另一个变量的某几位?
: 比如:
: reg [3:0]a;
: ...................
☆─────────────────────────────────────☆
   siaga (aaaa) 于  (Thu Jun  4 19:40:01 2009)  提到:
写RTL 代码不要图省事,还是一位
一位的分析比较好.
这样安全.
【 在 fastwind1985 (快风) 的大作中提到: 】
: 其实我的目的是,一个32bit的寄存器中,当前在第a位(每个时钟都可能变化),要找出
: 第a位后面第一个非零值是在哪一位。
: 本来想通过每次观察b[a],b[a-1],……再根据这些值中第一个非零值选通一下。但不能
: ...................
☆─────────────────────────────────────☆
   haveidea (有一个美丽的新世界) 于  (Thu Jun  4 19:41:46 2009)  提到:
看着简单,其实不好实现。
【 在 fastwind1985 (快风) 的大作中提到: 】
: 其实我的目的是,一个32bit的寄存器中,当前在第a位(每个时钟都可能变化),要找出
: 第a位后面第一个非零值是在哪一位。
: 本来想通过每次观察b[a],b[a-1],……再根据这些值中第一个非零值选通一下。但不能
: ...................
☆─────────────────────────────────────☆
   sudoer (穿梭天际只想觅自由) 于  (Thu Jun  4 19:51:51 2009)  提到:
可以的,我试过。DC和ncsim都是支持的。
这样的写法没问题的。
其实没必要到这里来问,自己试试不就可以了
【 在 siaga (aaaa) 的大作中提到: 】
: 不能
☆─────────────────────────────────────☆
   siaga (aaaa) 于  (Thu Jun  4 19:52:56 2009)  提到:
你确定?
【 在 sudoer (穿梭天际只想觅自由) 的大作中提到: 】
: 可以的,我试过。DC和ncsim都是支持的。
: 这样的写法没问题的。
: 其实没必要到这里来问,自己试试不就可以了
: ...................
☆─────────────────────────────────────☆
   jimu (极目) 于  (Thu Jun  4 20:22:46 2009)  提到:
通过优先编码树,可以获得f 的首1 位置,
以4:2 优先编码模块为基础( v= f[3]|f[2]|f[1]|f[0];s[1]=~(f[3] | f[2]);s[0]=~f[3]&(f[2] | ~f[1]) ),互联成32:5 优先编码模块。
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 其实我的目的是,一个32bit的寄存器中,当前在第a位(每个时钟都可能变化),要找出
: 第a位后面第一个非零值是在哪一位。
:
: 本来想通过每次观察b[a],b[a-1],……再根据这些值中第一个非零值选通一下。但不能
: b[a]这样用就有点麻烦了
:
:
: 【 在 RedLaser (范哥儿~) 的大作中提到: 】
:
: 这只是看起来简单了一点
: 就算是综合成功,实际上也还是把2'b10赋给b[31:30]到b[1:0]都做好放那了,然后做了个选通
: 面积一点不省
:
: 另外,好像a要定义成integer
:
:
:
: 【 在 fastwind1985 (快风) 的大作中提到: 】
: : : : : :
: : 可否用一个变量来选另一个变量的某几位?
: :
: : 比如:
: : reg [3:0]a;
: : reg [31:0]b;
: :
: : …………
: :
: : t1时刻, a <= 4'b1110;
: : t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
: :
: : 求教。bow~
: :
: : --
: :
: : ※ FROM: 122.234.54]
:
:
: --
:
:
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 122.234.54]
☆─────────────────────────────────────☆
   sudoer (穿梭天际只想觅自由) 于  (Thu Jun  4 20:57:02 2009)  提到:
当然,这种东西试过就知道了
我曾经做一个mask,然后用read-modify-write,来修改那个位置的东西,gatecount是一样的,但是明显这种写法可读性好
【 在 siaga (aaaa) 的大作中提到: 】
: 你确定?
☆─────────────────────────────────────☆
   fastwind1985 (快风) 于  (Thu Jun  4 21:26:46 2009)  提到:
我用VCS试了下报错啊
Error-[NCE] Non-constant expression
        The following expression should be a constant.
        Expression: a
        "var_in_var.v", 11: token is ':'
b[a:(a-1)] <= 2'b10;
    ^
Error-[NCE] Non-constant expression
        The following expression should be a constant.
        Expression: (a - 1)
        "var_in_var.v", 11: token is ']'
b[a:(a-1)] <= 2'b10;
          ^
2 errors
module var_in_var( clk, a, b);
input clk;
output [31:0]b;
reg [3:0]a;
reg [31:0]b;
initial a = 4'b1110;
always @(posedge clk)
begin
b[a:(a-1)] <= 2'b10;
end
endmodule
【 在 sudoer (穿梭天际只想觅自由) 的大作中提到: 】
当然,这种东西试过就知道了
我曾经做一个mask,然后用read-modify-write,来修改那个位置的东西,gatecount是一样的,但是明显这种写法可读性好
【 在 siaga (aaaa) 的大作中提到: 】
: 你确定?
☆─────────────────────────────────────☆
   fastwind1985 (快风) 于  (Thu Jun  4 21:31:10 2009)  提到:
if(a=0)
  casez(b)
  01???????,  a=1;
  001??????,  a=2;
  0001?????,  a=3;
  ……
  000000001,  a=31;
再if(a=1),case(b).....
在if(a=2) ,case (b) .....
每个都列出来这样子?
【 在 jimu (极目) 的大作中提到: 】
通过优先编码树,可以获得f 的首1 位置,
以4:2 优先编码模块为基础( v= f[3]|f[2]|f[1]|f[0];s[1]=~(f[3] | f[2]);s[0]=~f[3]&(f[2] | ~f[1]) ),互联成32:5 优先编码模块。
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 其实我的目的是,一个32bit的寄存器中,当前在第a位(每个时钟都可能变化),要找出
: 第a位后面第一个非零值是在哪一位。
:
: 本来想通过每次观察b[a],b[a-1],……再根据这些值中第一个非零值选通一下。但不能
: b[a]这样用就有点麻烦了
:
:
: 【 在 RedLaser (范哥儿~) 的大作中提到: 】
:
: 这只是看起来简单了一点
: 就算是综合成功,实际上也还是把2'b10赋给b[31:30]到b[1:0]都做好放那了,然后做了个选通
: 面积一点不省
:
: 另外,好像a要定义成integer
:
:
:
: 【 在 fastwind1985 (快风) 的大作中提到: 】
: : : : : :
: : 可否用一个变量来选另一个变量的某几位?
: :
: : 比如:
: : reg [3:0]a;
: : reg [31:0]b;
: :
: : …………
: :
: : t1时刻, a <= 4'b1110;
: : t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
: :
: : 求教。bow~
: :
: : --
: :
: : ※ FROM: 122.234.54]
:
:
: --
:
:
:
:
: --
:
☆─────────────────────────────────────☆
   sudoer (穿梭天际只想觅自由) 于  (Thu Jun  4 21:42:54 2009)  提到:
不要用<=, 用=试试
dc综合能过,vcs应该没问题的
【 在 fastwind1985 (快风) 的大作中提到: 】
: 我用VCS试了下报错啊
: Error-[NCE] Non-constant expression
:         The following expression should be a constant.
: ...................
☆─────────────────────────────────────☆
   fastwind1985 (快风) 于  (Thu Jun  4 21:52:24 2009)  提到:
ms还是不行啊。。。
Parsing design file 'var_in_var.v'
Error-[NCE] Non-constant expression
        The following expression should be a constant.
        Expression: a
        "var_in_var.v", 16: token is ':'
b[a:(a-1)] = 2'b10;
    ^
Error-[NCE] Non-constant expression
        The following expression should be a constant.
        Expression: (a - 1)
        "var_in_var.v", 16: token is ']'
b[a:(a-1)] = 2'b10;
          ^
2 errors
====代码
`timescale 1ns/ 100ps
module var_in_var(clk,b);
input clk;
output [31:0]b;
reg [3:0]a;
reg [31:0]b;
initial
begin
a = 4'b0;
#10 a = 4'b0111;
end
always @(a)
begin
b[a:(a-1)] = 2'b10;
end
endmodule
【 在 sudoer (穿梭天际只想觅自由) 的大作中提到: 】
不要用<=, 用=试试
dc综合能过,vcs应该没问题的
【 在 fastwind1985 (快风) 的大作中提到: 】
: 我用VCS试了下报错啊
: Error-[NCE] Non-constant expression
:         The following expression should be a constant.
: ...................
☆─────────────────────────────────────☆
   sudoer (穿梭天际只想觅自由) 于  (Thu Jun  4 22:00:55 2009)  提到:
2种写法,
1.
reg [31:0] b_int;
always @* begin
  b_int         = b;
  b_int[a-1+:2] = 2'b10;
end
always @(posedge clk) begin
  b <= #`DLY b_int;
end
2.
wire [15:0] a_mask_int = 16'h1<<a;
wire [31:0] a_mask;
genvar i;
generate for(i=0; i<16; i=i+1) begin
  assign a_mask[i*2+:2] = {2{a_mask_int[i]}};
end
reg [31:0] b_int;
always @* begin
  b_int = a_mask&{16{2'b10}}|(~a_mask)&b;
end
always @(posedge clk) begin
  b <= #`DLY b_int;
end
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 可否用一个变量来选另一个变量的某几位?
:
: 比如:
: reg [3:0]a;
: reg [31:0]b;
:
: …………
:
: t1时刻, a <= 4'b1110;
: t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
:
: 求教。bow~
:
: --
:
: ※ FROM: 122.234.54]
: ※ 来源:·水木社区 newsmth.net·[FROM: 122.234.54]
☆─────────────────────────────────────☆
   sudoer (穿梭天际只想觅自由) 于  (Thu Jun  4 22:04:31 2009)  提到:
我这个写法里面是假设b里面原来的数据还要保留的
如果你不打算保留,可以做的更简单
【 在 sudoer (穿梭天际只想觅自由) 的大作中提到: 】
: 2种写法,
: 1.
: reg [31:0] b_int;
: ...................
☆─────────────────────────────────────☆
   fastwind1985 (快风) 于  (Thu Jun  4 22:08:08 2009)  提到:
3x  学一下
【 在 sudoer (穿梭天际只想觅自由) 的大作中提到: 】
2种写法,
1.
reg [31:0] b_int;
always @* begin
  b_int         = b;
  b_int[a-1+:2] = 2'b10;
end
always @(posedge clk) begin
  b <= #`DLY b_int;
end
2.
wire [15:0] a_mask_int = 16'h1<<a;
wire [31:0] a_mask;
genvar i;
generate for(i=0; i<16; i=i+1) begin
  assign a_mask[i*2+:2] = {2{a_mask_int[i]}};
end
reg [31:0] b_int;
always @* begin
  b_int = a_mask&{16{2'b10}}|(~a_mask)&b;
end
always @(posedge clk) begin
  b <= #`DLY b_int;
end
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 可否用一个变量来选另一个变量的某几位?
:
: 比如:
: reg [3:0]a;
: reg [31:0]b;
:
: …………
:
: t1时刻, a <= 4'b1110;
: t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
:
: 求教。bow~
:
: --
:
: ※ FROM: 122.234.54]
☆─────────────────────────────────────☆
   interarsenal (阿四) 于  (Thu Jun  4 22:39:47 2009)  提到:
[a-1+:2]这个啥意思?
【 在 sudoer (穿梭天际只想觅自由) 的大作中提到: 】
2种写法,
1.
reg [31:0] b_int;
always @* begin
  b_int         = b;
  b_int[a-1+:2] = 2'b10;
end
always @(posedge clk) begin
  b <= #`DLY b_int;
end
2.
wire [15:0] a_mask_int = 16'h1<<a;
wire [31:0] a_mask;
genvar i;
generate for(i=0; i<16; i=i+1) begin
  assign a_mask[i*2+:2] = {2{a_mask_int[i]}};
end
reg [31:0] b_int;
always @* begin
  b_int = a_mask&{16{2'b10}}|(~a_mask)&b;
end
always @(posedge clk) begin
  b <= #`DLY b_int;
end
【 在 fastwind1985 (快风) 的大作中提到: 】
: : :
: 可否用一个变量来选另一个变量的某几位?
:
: 比如:
: reg [3:0]a;
: reg [31:0]b;
:
: …………
:
: t1时刻, a <= 4'b1110;
: t2时刻, b[a:a-1]  <= 2'b10;-------------------这句语法允许不?可否综合?
:
: 求教。bow~
:
: --
:
: ※ FROM: 122.234.54]
☆─────────────────────────────────────☆
   xaoyao (爱老婆爱生活) 于  (Thu Jun  4 23:08:21 2009)  提到:
[base +: length]这样的写法早就支持了
只是过去base和length必须是常数
而verilog2001支持base是变量
verilog2001很多语法都很方便的
特别描述大规模的阵列 比如
reg [31:0] x [0:31][0:31][0:31];
wire [4:0] a,b,c,d;
wire [3:0] y;
...
x[a][b][c][d +:4] <= y;
...
【 在 interarsenal (阿四) 的大作中提到: 】
: [a-1+:2]这个啥意思?
: 2种写法,
: 1.
: ...................
☆─────────────────────────────────────☆
   littlebu (小步~~) 于  (Thu Jun  4 23:20:38 2009)  提到:
不错!
但是你的4:2优先编码不对啊?
【 在 jimu (极目) 的大作中提到: 】
: 通过优先编码树,可以获得f 的首1 位置,
: 以4:2 优先编码模块为基础( v= f[3]|f[2]|f[1]|f[0];s[1]=~(f[3] | f[2]);s[0]=~f[3]&(f[2] | ~f[1]) ),互联成32:5 优先编码模块。
☆─────────────────────────────────────☆
   BourneJason (我长得很委婉,我心情很冲动) 于  (Sat Jun  6 21:51:14 2009)  提到:
这个描述是很方便,但是综合效果如何呢?
是不是多数还是用于验证?
【 在 xaoyao (爱老婆爱生活) 的大作中提到: 】
: [base +: length]这样的写法早就支持了
: 只是过去base和length必须是常数
: 而verilog2001支持base是变量
: ...................
☆─────────────────────────────────────☆
   jiangsusg (1314520) 于  (Mon Jun  8 14:25:49 2009)  提到:
用case来实现吧
【 在 fastwind1985 (快风) 的大作中提到: 】
: 可否用一个变量来选另一个变量的某几位?
: 比如:
: reg [3:0]a;
: ...................

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

网站地图

Top