请教verilog问题
moduleshifter'defineLEFT_SHIFT1'b0'defineRIGHT_SHIFT1'b1reg[31:0]addr,left_addr,right...
module shifter
'define LEFT_SHIFT 1'b0
'define RIGHT_SHIFT 1'b1
reg[31:0] addr,left_addr,right_addr;
reg control;
alwayse@(addr)
begin
left_addr=shift(addr,LEFT_SHIFT);
right_addr=shift(addr,RIGHT_SHIFT);
end
module shifter
'define LEFT_SHIFT 1'b0
'define RIGHT_SHIFT 1'b1
reg[31:0] addr,left_addr,right_addr;
reg control;
alwayse@(addr)
begin
left_addr=shift(addr,LEFT_SHIFT);
right_addr=shift(addr,RIGHT_SHIFT);
end
function[31:0]shift;
input[31:0]address;
input control;
begin
shift=(control=='LEFT_SHIFT) ?(addrsss<<1):(address>>1);
end
endfunction
endmodule
begin
shift=(control=='LEFT_SHIFT) ?(addrsss<<1):(address>>1);
end
endfunction
endmodule
1.这是北航夏老师书里面一道移位的例题,shift函数的第一行:
function[31:0]shift;
书上说了,函数的返回类型如没有说明,默认为reg类型,即相当于
function reg[31:0]shift;
2.第二,第三行
input[31:0]address;
input control;
按照常规,没有说明则默认为wire类型,即相当于:
input wire[31:0]address;
input wire control;
如果这样,主模块调用shift函数时怎么能将reg类型赋给被调函数的wire 类型呢?
说不通啊!
3 C语言中函数调用时有“传数值”与“传地址”的区别,设想VERILOG的函数调用是不是也是这样呢?
假设主模块在调用shift函数的时候,二则都用integer类型,shift函数的input端口与主模块的相应变量是用同一个地址吗?或者不是同一个地址(只是将值拷贝过来)? 展开
'define LEFT_SHIFT 1'b0
'define RIGHT_SHIFT 1'b1
reg[31:0] addr,left_addr,right_addr;
reg control;
alwayse@(addr)
begin
left_addr=shift(addr,LEFT_SHIFT);
right_addr=shift(addr,RIGHT_SHIFT);
end
module shifter
'define LEFT_SHIFT 1'b0
'define RIGHT_SHIFT 1'b1
reg[31:0] addr,left_addr,right_addr;
reg control;
alwayse@(addr)
begin
left_addr=shift(addr,LEFT_SHIFT);
right_addr=shift(addr,RIGHT_SHIFT);
end
function[31:0]shift;
input[31:0]address;
input control;
begin
shift=(control=='LEFT_SHIFT) ?(addrsss<<1):(address>>1);
end
endfunction
endmodule
begin
shift=(control=='LEFT_SHIFT) ?(addrsss<<1):(address>>1);
end
endfunction
endmodule
1.这是北航夏老师书里面一道移位的例题,shift函数的第一行:
function[31:0]shift;
书上说了,函数的返回类型如没有说明,默认为reg类型,即相当于
function reg[31:0]shift;
2.第二,第三行
input[31:0]address;
input control;
按照常规,没有说明则默认为wire类型,即相当于:
input wire[31:0]address;
input wire control;
如果这样,主模块调用shift函数时怎么能将reg类型赋给被调函数的wire 类型呢?
说不通啊!
3 C语言中函数调用时有“传数值”与“传地址”的区别,设想VERILOG的函数调用是不是也是这样呢?
假设主模块在调用shift函数的时候,二则都用integer类型,shift函数的input端口与主模块的相应变量是用同一个地址吗?或者不是同一个地址(只是将值拷贝过来)? 展开
1个回答
2017-02-19 · 知道合伙人互联网行家
关注
展开全部
这种写法完全就是业余写法么,你们verilog是怎么教的,或者说你有VHDL的经验,从VHDL转过来还是要改变一下风格的。
底下是你原来的写法。
module baidu(input xt,
input zq,
output reg[3:0] out);
always@(posedge zq or posedge xt) begin
if(zq) out<=0;
case(xt)
1'b1:out<=out+1'b1;
default;
endcase
end
endmodule
Warning (10240): Verilog HDL Always Construct warning at baidu.v(6): inferring latch(es) for variable "out", which holds its previous value in one or more paths through the always construct
Latch只是一个问题。你所报的warning是因为你把zq和xt在begin end里面都用上了。这完全是没有必要的,有些综合器认为时钟信号是不能用来测试的。什么叫做测试?就是if(zq)和case(xt)这种判定。
首先你要认定你要写的是时序逻辑,然后选定好时钟--比如xt,那么zq其实是一个复位信号。
xt都已经上升沿了,那么case(xt)是没有效果的,总是1。
改成这样不就好了:
module baidu(input xt,
input zq,
output reg[3:0] out);
always@(posedge zq or posedge xt) begin
if(zq) out<=0;
else out<=out+1'b1;
end
endmodule
底下是你原来的写法。
module baidu(input xt,
input zq,
output reg[3:0] out);
always@(posedge zq or posedge xt) begin
if(zq) out<=0;
case(xt)
1'b1:out<=out+1'b1;
default;
endcase
end
endmodule
Warning (10240): Verilog HDL Always Construct warning at baidu.v(6): inferring latch(es) for variable "out", which holds its previous value in one or more paths through the always construct
Latch只是一个问题。你所报的warning是因为你把zq和xt在begin end里面都用上了。这完全是没有必要的,有些综合器认为时钟信号是不能用来测试的。什么叫做测试?就是if(zq)和case(xt)这种判定。
首先你要认定你要写的是时序逻辑,然后选定好时钟--比如xt,那么zq其实是一个复位信号。
xt都已经上升沿了,那么case(xt)是没有效果的,总是1。
改成这样不就好了:
module baidu(input xt,
input zq,
output reg[3:0] out);
always@(posedge zq or posedge xt) begin
if(zq) out<=0;
else out<=out+1'b1;
end
endmodule
中智咨询
2024-08-28 广告
2024-08-28 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。...
点击进入详情页
本回答由中智咨询提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询