以下systemverilog中的代码失败:
module test_dly;
reg clk = 0;
wire w_clk_d;
always #1ns clk <= ~clk;
assign #1400ps w_clk_d = clk;
endmodule
Run Code Online (Sandbox Code Playgroud)
我预计w_clk_d将是clk的延迟版本,但事实并非如此.似乎#如果新事件在延迟到期之前到达,则#不工作.我编写了代码来处理这个问题,但有没有办法让#按预期工作?谢谢,
我想按如下方式对参数化的 32 位总线进行“或”运算:out_bus = bus1 | 巴士2 | 巴士 3 | ... | 总线N;
我还想将总线声明为数组(N 是一个固定参数,在编译时定义):
reg [31:0] 总线[N-1:0];
我能想到的最好方法是这样的:
parameter N;
reg [N-1:0] temp;
reg [31:0] out_bus;
reg [31:0] bus[N-1:0];
always @(*) begin
for (j=0; j<32; j=j+1) begin : bits
for (k=0; k < N; k=k+1) begin : bus
temp = bus[k][j];
end
out_bus[j] = |temp;
end
end
Run Code Online (Sandbox Code Playgroud)
这个必须是可以综合的。必须有一个更干净/更好的方法,不是吗?
以下程序的答案是{6,7,8},但我不明白为什么,请解释一下:
module q ();
typedef byte byteq[$];
initial begin
byte ans[$];
ans = byteq'({>>byte{24'h060708}});
$display("A:expect '{6,7,8} get %p", ans);
end
endmodule
Run Code Online (Sandbox Code Playgroud) I was supposed to apply recursion in Verilog . The code which I have designed doesn't show any error. Please have a look at my code where the task (splitt00) is recursively called. Does Verilog support recursion and how can I implement a recursive logic?
task split00;
input [0:n-1] a;
input [0:n-1] b;
input [0:n-1] num0;
output [0:2*n-1] s;
reg [0:n-1] a0,b0,u0,v0,w0,s0,s1,a1,b1,a2,b2,u1,w1,v1;
reg [0:n-1] num00;
begin
num00=num0;
if(num00==2)
begin
u0=(a/10)*(b/10);
w0=(a%10)*(b%10);
if (((a%10-a/10)*(b%10-b/10))<0)
begin
v0=((a%10-a/10)*(b%10-b/10))*-1;
s=u0*100+(u0+w0+v0)*10+w0;
end
else
begin
v0=((a%10-a/10)*(b%10-b/10)); …Run Code Online (Sandbox Code Playgroud) 我有一个4位寄存器。
reg[3:0] a;
Run Code Online (Sandbox Code Playgroud)
我想给它分配一个位,就像
a <= '1;
Run Code Online (Sandbox Code Playgroud)
显然它不是相同的 1'b1 和 1。我是 verilog 新手,不确定它的语法。任何人都可以启发我吗?
- 此代码使用Modelsim 10.2d以verilog编写.下面的错误表明{cout,l3}赋值存在一些问题.
module alu(a,b,bin,cin,op,cout,res);
input [31:0] a,b;
input [1:0] op;
input bin,cin;
reg [31:0] l1,l2,l3;
output cout;
output [31:0] res;
assign l1 = a & b;
assign l2 = a | b;
initial
if(bin == 1'b0)
assign {cout,l3} = a + b + cin;
else
assign {cout,l3} = a - b + cin;
mux4to1(l1,l2,l3,op,res);
endmodule
Error-
v(14): LHS in procedural continuous assignment may not be a net: cout.
v(16): LHS in procedural continuous assignment may not be a net: …Run Code Online (Sandbox Code Playgroud) 我发现这个systemverilog:
task automatic xxx(ref xxxpackage bus,input interface ift);
Run Code Online (Sandbox Code Playgroud)
我想知道它的用法ref.有什么好处?
我正在尝试创建一个for循环,在循环迭代的情况下为逻辑数组分配不同的值.
所以,例如,假设我试图实例化两个不同的砖,宽度为10,高度为5.我们也说这些值都是10位.对于两块砖,我有代码:
logic[19:0] Brick_Width;
logic[19:0] Brick_Height;
Run Code Online (Sandbox Code Playgroud)
第一块砖的宽度和高度将被分配到最重要的10位,第二块的最低有效位为10位.
这是我目前拥有的代码:
int i = 19;
initial
begin
for(i=19; i>=0; i=i-10)
begin
assign Brick_Width[i:i-9] = 10;
assign Brick_Height[i:i-9] = 5;
end
end
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个错误,说"我"不是一个常数.关于如何做到这一点的任何想法?
在SystemVerilog仿真中,预分配区域是给定时隙中的几个区域之一。该地区的实际目的是什么?谁能用一个有效的例子来解释这一点?
SystemVerilog 是否支持以下代码?
int cnt = 0;
wait( cnt == (cnt+1) )
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出LRM中的部分吗?